如何使用Django FileFields在模板中显示当前文件

时间:2010-06-19 10:41:02

标签: django validation file templates file-upload

我有点卡住,我现在已经使用Django了一段时间,但实际上我似乎无法找到这个东西。这很奇怪,因为它应该是一件简单的事情。

我一直在谷歌搜索,似乎无法找到解决方案,这可能是因为它是一件简单的事情。

问题是,我有一个ModelForm,它有一个FileField,当我用模型实例渲染这个表单,并且该对象包含一个上传文件时,我想显示当前文件,(如管理员确实),但我似乎无法做到这一点。

这两种技术都不起作用:

{{ form.as_p }}
{{ field.label_tag }}

我一直在管理员模板中搜索,但似乎无法找到魔法。表单正确呈现对象的所有其他数据

问题2是因为在使用对象实例呈现更改表单时未显示上载的文件,因此表单在我尝试保存时无法验证,因为它对先前上载的文件一无所知。

那么如何在Django中更改表单中的文件字段,如何显示当前上传的文件以及如何验证表单。

3 个答案:

答案 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(带有额外的复选框以删除它们)。不知道如何显示非图像字段,但也许这个片段会给你一些灵感。