我有一个包含FileField和CharField的Form。两者都如预期的那样工作。
这两个字段本身都不需要,但必须给定其中一个字段。因此,我想添加一个验证,如果两者都为空,则该验证将失败。
在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
问题不在于表单,而在于相关视图:
错误的表单。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
传递到表单,所以难怪验证没有找到它。在这一点之下,我直接从请求中检索到了文件,并且很好。
正确的表单.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")