2011-11-30 159 views
0

我寫我自己的一種形式:Django表單模板錯誤

class Autopoweroff_Form(forms.Form): 
    autopoweroff_groups = forms.CharField(required=True) 
    autopoweroff_groups_hosts = forms.CharField(required=True) 
    autopoweroff_groups_start = forms.CharField(required=True) 
    autopoweroff_groups_end = forms.CharField(required=True) 
    autopoweroff_groups_startup_delay = forms.CharField(required=True) 
    autopoweroff_groups_idle_time = forms.CharField(required=True) 

現在我知道,我不會有明確設置reuqired = true,但現在承擔它吧。 無論如何,讓我們繼續。

現在,因爲我討厭在視圖中做驗證等我剛纔定義爲形式的更新功能:

def update(self, data): 
     if not self.is_bound and data is not None: 
      raise Exception() 

     if self.is_valid(): 
      curr_group = self.cleaned_data['autopoweroff_groups'] 
      ... 

,然後在我看來,把它像這樣:

if request.method == 'POST': 
     form = Autopoweroff_Form(data=request.POST) 
     form.update(data=request.POST) 
     return HttpResponseRedirect('/admin/thin/create_autopoweroff') 
    else: 
     form = Autopoweroff_Form() 

    ... 

現在的問題是,如果我不在表單中輸入任何內容,表單將按原樣返回,而不會顯示任何錯誤。我也知道,它不會做任何事情,因爲:

https://docs.djangoproject.com/en/1.3/ref/forms/validation/

事實上,Django將目前完全消滅cleaned_data字典是否有形式的任何錯誤。但是,這種行爲在未來可能會發生變化,因此,首先清理自己並不是一個好主意。

,如果我嘗試:

def update(self, data): 
     if not self.is_bound and data is not None: 
      raise Exception() 

     if self.is_valid(): 
      curr_group = self.cleaned_data['autopoweroff_groups'] 
      ... 
     else: 
      print self.errors 

,我感到我本來希望在模板中看到的錯誤。 我也試過了:

def clean_autopoweroff_groups(self): 
     autopoweoff_groups = self.cleaned_data.get('autopoweroff_groups', "") 
     if autopoweoff_groups == '': 
      print "Validation Error" 
      raise forms.ValidationError('Please Enter A Name') 
     return autopoweroff_groups 

我究竟在做什麼錯?

UPDATE: 在我看來:

if request.method == 'POST': 
     form = Autopoweroff_Form(data=request.POST) 

     if form.is_valid(): 
      form.update(data=request.POST) 
      return HttpResponseRedirect('/admin/thin/create_autopoweroff') 
    else: 
     form = Autopoweroff_Form() 

,並在我的表單中刪除,如果self.is_valid()

回答

0

Django的已建立的驗證,所以你並不需要重寫一遍:

class Autopoweroff_Form(forms.Form): 
    # I suggest not prefixing your fields with the name of the class 
    groups = forms.CharField(required=True) 
    hosts = forms.CharField(required=True) 
    start = forms.CharField(required=True) 
    end = forms.CharField(required=True) 
    delay = forms.CharField(required=True) 
    idle_time = forms.CharField(required=True) 

,並在您的視圖:

if request.method == 'POST': 
    form = Autopoweroff_Form(data=request.POST) 
    if form.is_valid(): 
     return HttpResponseRedirect('/admin/thin/create_autopoweroff') 
else: 
    form = Autopoweroff_Form() 

請注意,您在視圖中調用is_valid(),而不是表單。

如果要對個別字段或字段分組執行如此複雜的驗證,可以覆蓋表格clean()clean_[field_name]()方法。

在這裏看到:

https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

+0

非常感謝你 –