皆様ごきげんよう、今回は特定のファイル形式のアップロードを許可する実装方法について書き残しておきます。少しでも参考になりますと幸いです。
前提情報
- 利用しているデータベースは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