我有点卡住,我现在已经使用Django了一段时间,但实际上我似乎无法找到这个东西。这很奇怪,因为它应该是一件简单的事情。
我一直在谷歌搜索,似乎无法找到解决方案,这可能是因为它是一件简单的事情。
问题是,我有一个ModelForm,它有一个FileField,当我用模型实例渲染这个表单,并且该对象包含一个上传文件时,我想显示当前文件,(如管理员确实),但我似乎无法做到这一点。
这两种技术都不起作用:
{{ form.as_p }}
{{ field.label_tag }}
我一直在管理员模板中搜索,但似乎无法找到魔法。表单正确呈现对象的所有其他数据
问题2是因为在使用对象实例呈现更改表单时未显示上载的文件,因此表单在我尝试保存时无法验证,因为它对先前上载的文件一无所知。
那么如何在Django中更改表单中的文件字段,如何显示当前上传的文件以及如何验证表单。
答案 0 :(得分:6)
你没有好好看,解决方案是contrib / admin / widgets.py中的一个自定义小部件,即这个:
class AdminFileWidget(forms.FileInput):
"""
A FileField Widget that shows its current value if it has one.
"""
def __init__(self, attrs={}):
super(AdminFileWidget, self).__init__(attrs)
def render(self, name, value, attrs=None):
output = []
if value and hasattr(value, "url"):
output.append('%s <a target="_blank" href="%s">%s</a> <br />%s ' % \
(_('Currently:'), value.url, value, _('Change:')))
output.append(super(AdminFileWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output))
您可以使用widgets meta option ModelForms来使用此(或改编版本)。
据我所知,你的第二个问题不应该存在,即使没有更好的小部件,也要知道它是否在使用自定义小部件后仍然存在。
答案 1 :(得分:1)
我不认为beruic的答案得到足够的关注作为评论,但他真的得到了这个,因为Django现在自动修复它。
&#34;来自Django.forms的正常ClearableFileInput为我做了。&#34;
见下面的例子。
<强> models.py 强>
class PosterForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PosterForm, self).__init__(*args, **kwargs)
class Meta:
model = Poster
fields = ('title', 'img')
widgets = {
'img' : forms.ClearableFileInput(),
'title' : forms.TextInput()
}
答案 2 :(得分:0)
我使用此snippet来显示ImageFields(带有额外的复选框以删除它们)。不知道如何显示非图像字段,但也许这个片段会给你一些灵感。