Django使用clean()验证FileField



我有一个包含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中,myfileNone

如何在表单验证期间检查是否已填写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")                   

相关内容

  • 没有找到相关文章

最新更新