Django:ファイルアップロードの時、特定のファイル形式のみを許可したい場合

皆様ごきげんよう、今回は特定のファイル形式のアップロードを許可する実装方法について書き残しておきます。少しでも参考になりますと幸いです。

前提情報

  • 利用しているデータベースはMysql。
  • models.py、views.py、forms.py、htmlファイルに設定を追加していきます。

models.pyのサンプル

まずは日記に、画像を付けられるようにclass Diaryの中でvalidators機能を利用します。

from django.core.validators import FileExtensionValidator

class Diary
    title = models.CharField(
        max_length=255,
        verbose_name='タイトル',
        blank=False,
        null=False)
    
    note = models.TextField(
        max_length=255,
        verbose_name='日記',
        blank=False,
        null=False)
    
    tag = models.ManyToManyField(
        Tag,
        null=True,
        verbose_name='タグ')
    
    imagefile = models.FileField(
        MediaFile,
        null=False,
        validators=[FileExtensionValidator(['png', 'jpg'])])

forms.pyのサンプル

from django import forms
from .models import Diary

class PostDiaryForm(forms.ModelForm):
    class Meta:
        model = Diary
        fields = ['imagefile'] 
        fields = (
            'title',
            'description',
            'tag',
            'imagefile')
        labels = {
            'imagefile': 'ファイル',
        }

            # フォームを綺麗にするための記載
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs['class'] = 'form-control'

views.pyのサンプル

if form.is_valid()の部分で、models.pyで指定したFileExtentionValidatorが実行されます

class DiaryPostView(CreateView):
    form_class = PostDiaryForm
    template_name = "diary_submitform.html"
    success_url = reverse_lazy("アプリ名:my_diarypage")

    def upload_file(request):
        if request.method == 'POST':
            form = PostDiaryForm(request.POST, request.FILES)

            if form.is_valid():
                diary = form.save(commit=False)
                diary.uploaded_by = request.user
                diary.save()
                return resolve_url("アプリ名:my_diarypage")
        else:
            form = PostDiaryForm()
            return render(request, 'diary_submitform.html', {'form': form})

HTMLのサンプル

必ずenctypeを指定する事

    <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <br>
        <div class="mt-3">
            <button type="submit" class="btn btn-primary">アップロード</button>
        </div>
    </form>

これで違うフォーマットのファイルをアップロードして投稿しようとすると、エラーが表示されるようになりました。

Comments are closed

Latest Comments

No comments to show.