2010-06-19 75 views
3

我有点卡住了,我一直在使用Django一段时间,但是我实际上似乎找不到这个东西了。这很奇怪,因为它应该是一件简单的事情。如何使用Django FileFields在模板中显示当前文件

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

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

这些技术无论是工作:

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

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

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

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

回答

4

你没有环顾四周不够好,解决的办法是在contrib请/管理/ 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)) 

你可以使用这个(或改编版) ModelForms的widgets meta option

据我所知,你的第二个问题根本不应该存在,即使没有更好的小部件,也要知道在使用自定义小部件后它是否仍然存在。

+1

啊,一个自定义的widget,为什么没有的,我的东西。超级,将尽快尝试。 – espenhogbakk 2010-06-19 19:18:17

+0

来自'Django.forms'的普通'ClearableFileInput'对我来说就是这样。 – beruic 2015-10-20 10:13:53

0

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

0

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

“来自Django.forms的正常ClearableFileInput为我做了。”

请看下面的例子。

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() 
     }