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 - 如何检测是不是删除文件的主要内容,如果未能解决你的问题,请参考以下文章