2011-03-14 60 views
4

在我的管理界面中,我有一個帶有ImageField的窗體。除非某些其他字段出現驗證錯誤,否則一切都很好。在這些情況下,表單會返回給用戶進行更正,但已從表單中清除已加載的圖像文件。在Django驗證錯誤後在ImageField中重新提交圖像

有關如何將已提交的圖像重新加載到表單以便保存圖像的任何想法?

謝謝!代碼

一些有趣的位:

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

回答

6

HTML <input type="file">字段不能預填充數據。因此,如果驗證在另一個字段上失敗,您將不得不重新選擇圖像。

這是一個HTML /瀏覽器安全措施。如在,沒有辦法!

想象一下,如果一個網站可以將C:\Windows\something_important注入頁面角落的表單中?


如果這是關鍵的功能,你可以...

  1. 強制文件進行形式驗證之前上傳並在用戶會話
  2. 設置你的模板來隱藏文件名如果上傳文件,則在重新顯示時顯示「成功」消息
  3. 當會話包含上載信息時禁用文件字段驗證
  4. 在真實有效時從您的會話中拉取文件名fo RM提交
5

這裏是Django應用程序,叫做Django的文件重新提交。它解決了這個問題。

https://github.com/un1t/django-file-resubmit

+0

是它解決了只爲管理形式?因爲我看不到常規窗體的小部件示例。 – alexche8 2014-11-06 11:14:07

+0

是的,這是針對管理員表單的。 – un1t 2014-11-10 08:04:55