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 中,myfileNone.

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