当我使用字段的清理功能
时,像(图像)这样的文件字段的清除复选框不起作用清洁功能:
def clean_image(self):
#file = self.cleaned_data['image']
file = self.cleaned_data['image']
if file:
if not os.path.splitext(file.name)[1] in [".jpg", ".png"]:
raise forms.ValidationError(
_("Doesn't have proper extension"))
return file
但如果我删除了clean函数,则复选框清除功能正常,使用这两种方法是否有任何冲突
答案 0 :(得分:0)
我遇到了同样的问题,一直在寻找答案无处可寻。
我假设您正在使用ModelForm
,但如果不是这样,那么这应该仍然有意义。似乎如果clean_<field_name>()
函数没有返回任何内容,那么Django将对所讨论的模型上的现有FileField
不做任何操作。
为了在文件更改时正确应用clean函数,首先应执行检查if file and not isinstance(file, FieldFile)
。这意味着如果再次保存表单,则不会重复检查已保存到模型的文件,同时将检查新文件的合规性。
然后clear
复选框的问题是,如果选中该框,表单返回给函数的数据只是False
,这意味着清除函数中的逻辑被绕过,没有任何东西是回。目前,我对此问题的临时解决方法如下:
from django import forms
from django.db.models.fields.files import FieldFile
def clean_profile_picture(self):
file = self.cleaned_data["profile_picture"]
if file and not isinstance(file, FieldFile):
content_type = file.content_type
if content_type in ['image/jpeg', 'image/png']:
# Reject files that don't match whitelisted content types
raise forms.ValidationError("File type is not allowed (Allowed types: jpeg, png).")
return file
elif not file:
# If 'clear' checkbox is checked, blank the FieldFile
return False
我希望这对于许多可能的错误情况都会不捕获,但它会有效地清除模型上的FileField
。请注意,条件使用的是FieldFile
,而不是FileField
- 这是故意的。您可以阅读更多相关信息here。您可能还会发现我使用的content_type
检查更合适,因为它会捕获带有奇怪或不正确文件扩展名的文件。
希望这会有所帮助。