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

Posted

技术标签:

【中文标题】Django ClearableFileInput - 如何检测是不是删除文件【英文标题】:Django ClearableFileInput - how to detect whether to delete the fileDjango ClearableFileInput - 如何检测是否删除文件 【发布时间】:2015-08-30 22:04:31 【问题描述】:

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

表单按照我的预期呈现,带有清除现有文件的复选框。但是,在处理表单提交时,“图像清除”复选框总是给我一个“无”值。

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

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

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

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

我应该注意,如果我上传一个新图像,那么这有效,这只是我删除/清除图像的情况(它在 Django 管理页面中有效,所以假设这意味着我的模型定义可以不允许将图像附加到模型上)

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

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

【问题讨论】:

【参考方案1】:

让我在这里添加解决问题的代码 - 我决定将此逻辑放入 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)

【讨论】:

【参考方案2】:

您不应选中复选框,而应检查文件输入字段的值。如果为 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

【讨论】:

以上是关于Django ClearableFileInput - 如何检测是不是删除文件的主要内容,如果未能解决你的问题,请参考以下文章

Django 形式。如何从initial_text隐藏冒号?

Django - 学习目录

Django初识

Django之路

Django系列

django 错误