アップロードされたファイルのファイルタイプを検証する必要があり、PDF、プレーンテスト、およびMSWordファイルのみを許可する必要があります。これが私のモデルと検証機能付きのフォームです。ただし、拡張子がなくてもファイルをアップロードできます。
class Section(models.Model):
content = models.FileField(upload_to="documents")
class SectionForm(forms.ModelForm):
class Meta:
model = Section
FILE_EXT_WHITELIST = ['pdf','text','msword']
def clean_content(self):
content = self.cleaned_data['content']
if content:
file_type = content.content_type.split('/')[0]
print file_type
if len(content.name.split('.')) == 1:
raise forms.ValidationError("File type is not supported.")
if content.name.split('.')[-1] in self.FILE_EXT_WHITELIST:
return content
else:
raise forms.ValidationError("Only '.txt' and '.pdf' files are allowed.")
これがビューです、
def section_update(request, object_id):
section = models.Section.objects.get(pk=object_id)
if 'content' in request.FILES:
if request.FILES['content'].name.split('.')[-1] == "pdf":
content_file = ContentFile(request.FILES['content'].read())
content_type = "pdf"
section.content.save("test"+'.'+content_type , content_file)
section.save()
私の見解では、ファイルをから保存しているだけですrequest.FILE
。save()中に、clean_contentを呼び出し、コンテンツタイプの検証を行うと思いました。おそらく、clean_contentは検証をまったく要求していません。