Django 使用 clean() 验证 FileField
Django validate FileField with clean()
我有一个包含 FileField 和 CharField 的表单。两者都按预期工作。
这两个字段本身都不是必需的,但必须提供其中一个。所以我想添加一个验证,如果两者都为空则验证失败。
在forms.py
中:
class MyForm(forms.Form):
mytext = forms.CharField(
label = "Enter text",
required=False
)
myfile = forms.FileField(
label = "Or upload file",
required=False
)
def clean(self):
super(MyForm, self).clean()
mytext_value = self.cleaned_data.get("mytext")
myfile_value = self.cleaned_data.get("myfile") # this remains empty, even after selecting a file! :-(
if not mytext_value and not myfile_value:
self.add_error("mytext", "Either text or file must be given!")
return self.cleaned_data
即使文件已上传,此验证也会失败! (如果使用了文本字段,则不会失败。)
如果我禁用验证,该表单在应用程序中可以正常工作。在 views.py
中,我可以从请求 (myfile_value = request.FILES.get("myfile")
) 中获取上传的文件并使用它。
但是我如何在 clean()
调用期间获取文件的内容,而我还没有请求?
self.files
给我一个空的 MultiValueDict,self.data
根本不包含键 myfile
,而在 self.cleaned_data
中,myfile
是 None
.
如何在表单验证期间检查 FileField 是否已填写?
问题不在于表单,而在于关联视图:
错误forms.py:
if request.method == "POST":
form = MyForm(request.POST)
if form.is_valid():
mytext = request.POST.get("mytext")
myfile = request.FILES.get("myfile")
我没有把request.FILES
传给表单,难怪验证没找到。在这一点以下,我直接从请求中检索了文件并且没问题。
右forms.py:
if request.method == "POST":
form = MyForm(request.POST, request.FILES)
if form.is_valid():
mytext = form.cleaned_data.get("mytext")
myfile = form.cleaned_data.get("myfile")
我有一个包含 FileField 和 CharField 的表单。两者都按预期工作。
这两个字段本身都不是必需的,但必须提供其中一个。所以我想添加一个验证,如果两者都为空则验证失败。
在forms.py
中:
class MyForm(forms.Form):
mytext = forms.CharField(
label = "Enter text",
required=False
)
myfile = forms.FileField(
label = "Or upload file",
required=False
)
def clean(self):
super(MyForm, self).clean()
mytext_value = self.cleaned_data.get("mytext")
myfile_value = self.cleaned_data.get("myfile") # this remains empty, even after selecting a file! :-(
if not mytext_value and not myfile_value:
self.add_error("mytext", "Either text or file must be given!")
return self.cleaned_data
即使文件已上传,此验证也会失败! (如果使用了文本字段,则不会失败。)
如果我禁用验证,该表单在应用程序中可以正常工作。在 views.py
中,我可以从请求 (myfile_value = request.FILES.get("myfile")
) 中获取上传的文件并使用它。
但是我如何在 clean()
调用期间获取文件的内容,而我还没有请求?
self.files
给我一个空的 MultiValueDict,self.data
根本不包含键 myfile
,而在 self.cleaned_data
中,myfile
是 None
.
如何在表单验证期间检查 FileField 是否已填写?
问题不在于表单,而在于关联视图:
错误forms.py:
if request.method == "POST":
form = MyForm(request.POST)
if form.is_valid():
mytext = request.POST.get("mytext")
myfile = request.FILES.get("myfile")
我没有把request.FILES
传给表单,难怪验证没找到。在这一点以下,我直接从请求中检索了文件并且没问题。
右forms.py:
if request.method == "POST":
form = MyForm(request.POST, request.FILES)
if form.is_valid():
mytext = form.cleaned_data.get("mytext")
myfile = form.cleaned_data.get("myfile")