在我的管理界面中,我有一个带有ImageField的表单 . 除非某些其他字段引发验证错误,否则一切都很有效 . 在这些情况下,表单将返回给用户进行更正,但已从表单中清除已加载的图像文件 .
有什么想法,以某种方式,将已提交的图像重新加载到表单,以便保存图像beeing?
谢谢!
太有趣的代码:
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 回答
HTML
<input type="file">
字段无法预先填充数据 . 因此,如果验证在另一个字段上失败,则必须重新选择该图像 .这是一个HTML /浏览器安全措施 . 就像在,没有办法绕过它!
想象一下,如果某个网站可以将
C:\Windows\something_important
注入页面一角的表单中吗?如果这是关键功能,你可以......
强制在表单验证之前上载文件,并在用户会话中存储文件名
设置模板,以便在上载文件时重新显示"success"消息
会话包含上载信息时禁用文件字段验证
在真实有效表单提交时从会话中提取文件名
这是django app,名为django-file-resubmit . 它解决了这个问题 .
https://github.com/un1t/django-file-resubmit