2010-03-12 72 views
6

如何在表單提交但驗證失敗後設置字段元素的值?例如Django驗證失敗時的表格字段初始值

if form.is_valid(): 
    form.save() 
else: 
    form.data['my_field'] = 'some different data' 

我真的不想把它放在視圖中,而是寧願將它作爲窗體類的一部分。

感謝

回答

5

我落得這樣做

if request.method == 'POST': 
    new_data = request.POST.copy() 
    form = MyForm(data=new_data) 
    if form.is_valid(): 
     form.save() 
    else: 
     new_data['myField'] = 'some different data' 

希望這可以幫助別人

13

documentation說:

如果你有勢必 Form實例,並希望更改數據以某種方式,或者如果你想綁定一個未綁定的表單實例到一些數據,創建另一個表單實例。在表單實例中有無法更改數據。一旦創建了表單實例,您應該考慮它的數據不可更改,無論它是否有數據。

我真的不相信你的代碼有效。但是沒問題。基於文檔我會做這種方式:

if request.method == 'POST': 
    data = request.POST.copy() 
    form = MyForm(data) 
    if form.is_valid(): 
     form.save() 
    else: 
     data['myField'] = 'some different data' 
     form = MyForm(initial=data) 
+3

偉大的解決方案。如果你想要保留表單的錯誤,你可以使用'new_form = MyForm(initial = data)new_form._errors = form._errors form = new_form' – Michael 2014-09-09 12:19:02

0

你可以把它放在窗體類是這樣的:

class MyForm(forms.Form): 

    MY_VALUE = 'SOMETHING' 
    myfield = forms.CharField(
     initial=MY_VALUE, 
     widget=forms.TextInput(attrs={'disabled': 'disabled'}) 

    def __init__(self, *args, **kwargs): 

     # If the form has been submitted, populate the disabled field 
     if 'data' in kwargs: 
      data = kwargs['data'].copy() 
      self.prefix = kwargs.get('prefix') 
      data[self.add_prefix('myfield')] = MY_VALUE 
      kwargs['data'] = data 

     super(MyForm, self).__init__(*args, **kwargs) 

它的工作方式,是它測試,看看是否所有的數據已被傳遞給窗體構造函數。如果有,它會複製它(未複製的數據是不可變的),然後在繼續實例化表單之前放入初始值。