Django ClearableFileInput - 如何检测是否删除文件

Django ClearableFileInput - how to detect whether to delete the file

我正在为我的表单使用 Django Crispy Forms,并可选择上传图像(我的模型中的 ImageField)

表单按照我的预期呈现,带有用于清除现有文件的复选框。但是,在处理表单提交时,'image-clear' 复选框总是给我一个 'None' 值。

image_clear = form.cleaned_data.get("image-clear")
print image_clear

在页面的 HTML 中,我注意到输入复选框没有值属性,请参阅:

<input id="image-clear_id" type="checkbox" name="image-clear">

所以我想知道这是否是问题所在,但是当我查看 Django 管理站点中的呈现时,相应的 HTML 输入字段也没有值 - 但它仍然标识图片应该删除。

我应该注意,如果我上传一张新图片,那么它就可以工作,只有我是 removing/clearing 图片的情况(并且它在 Django 管理页面中工作,所以假设这意味着我的模型清晰度可以允许没有图像附加到模型)

所以...在我的表单处理中,我如何检测图像是否应该被删除?

我确定我在这里遗漏了一些简单的东西 - 非常感谢任何帮助。

您不应该选中复选框,而应该选中文件输入字段的值。如果为 False,则可以删除该文件。否则就是上传的文件。参见:https://github.com/django/django/blob/339c01fb7552feb8df125ef7e5420dae04fd913f/django/forms/widgets.py#L434

    # False signals to clear any existing value, as opposed to just None
    return False
return upload

让我在这里添加解决问题的代码 - 我决定将此逻辑放入 ModelForm.clean():

class Document(models.Model):
    upload = models.FileField(upload_to=document_name, blank=True)

class DocumentForm(ModelForm):
    def clean(self):
        cleaned_data = super(DocumentForm, self).clean()
        upload = cleaned_data['upload']
        if (upload == False) and self.instance.upload:
            if os.path.isfile(self.instance.upload.path):
                self.instance.upload.delete(False)