代码之家  ›  专栏  ›  技术社区  ›  espenhogbakk

如何在带有Django文件字段的模板中显示当前文件

  •  3
  • espenhogbakk  · 技术社区  · 16 年前

    我有点卡住了,我已经用Django有一段时间了,但我似乎真的找不到这个东西。这很奇怪,因为这应该是一件简单的事情。

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

    问题是,我有一个ModelForm,它有一个FileField,当我用一个模型实例呈现这个表单时,对象包含一个上传的文件,我想显示当前的文件(就像管理员那样),但我似乎不能这样做。

    这两种技术都不起作用:

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

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

    第二个问题是,由于上载的文件在呈现带有对象实例的更改表单时不显示,因此在尝试保存时表单无法验证,因为它对以前上载的文件一无所知。

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

    3 回复  |  直到 16 年前
        1
  •  6
  •   pyjavo knbk    6 年前

    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 模型形式。

        2
  •  2
  •   Tuxedo Joe    9 年前

    我不认为贝鲁伊奇的回答作为一个评论得到足够的关注,但他真的得到了这个,因为Django现在自动修复了这个问题。

    “来自Django.forms的普通ClearableFileInput为我完成了它。”

    参见下面的示例。

    型号.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()
            }
    
        3
  •  0
  •   dzida    16 年前

    我用这个 snippet 显示ImageFields(使用额外的复选框删除它们)。不知道如何显示非图像字段,但也许这个片段会给你一些启发。