我正在为我的表单使用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输入字段也没有值 - 但它仍然标识应该删除图像。 / p>
我应该注意,如果我上传一个新图像,那么这是有效的,它只是我正在删除/清除图像的情况(它在Django管理页面中工作,所以假设这意味着我的模型定义可以不允许图像附加到模型上)
所以...在我的表格处理中,如何检测图像是否应该被删除?
我确信我在这里缺少一些简单的东西 - 任何帮助都非常感激。
答案 0 :(得分:4)
您不应选中该复选框,而是检查文件输入字段的值。如果为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
答案 1 :(得分:0)
让我在这里添加解决问题的代码 - 我决定将这个逻辑放到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)