在Django中验证错误后重新提交ImageField中的图像

时间:2011-03-14 01:52:16

标签: django django-admin django-forms

在我的管理界面中,我有一个带有ImageField的表单。除非其他一些字段引发验证错误,否则一切都很有效。在这些情况下,表单将返回给用户进行更正,但已从表单中清除已加载的图像文件。

如何以某种方式重新将已提交的图像重新加载到表单中,以便保存图像?

谢谢!

有趣的代码:

class DealForm(forms.ModelForm):
    image = forms.ImageField(required=False,widget=AdminImageWidget)

    def clean():
        data = self.cleaned_data
        date_start = data.get('date_start')
        date_end = data.get('date_end')
        (... several other validations ...)
        return data

class AdminImageWidget(forms.FileInput):
    def __init__(self, attrs={}):
        super(AdminImageWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        output = []
        if value and hasattr(value, "url"):
            output.append(('<a target="_blank" href="%s">' 
                            '<img src="%s" /></a> '
                            % (value.url, value.url_200x150)))
        output.append(super(AdminImageWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

2 个答案:

答案 0 :(得分:6)

HTML <input type="file">字段无法预先填充数据。因此,如果验证在另一个字段上失败,则必须重新选择图像。

这是一种HTML /浏览器安全措施。就像在,没有办法绕过它!

想象一下,如果某个网站可以将C:\Windows\something_important注入页面一角的表单中吗?


如果这是关键功能,你可以......

  1. 强制在表单验证之前上载文件并将文件名存储在用户会话中
  2. 设置模板,以便在文件上传时重新显示“成功”消息
  3. 会话包含上传信息时禁用文件字段验证
  4. 在真实有效表单提交时从会话中提取文件名

答案 1 :(得分:5)

这是django app,名为django-file-resubmit。它解决了这个问题。

https://github.com/un1t/django-file-resubmit