2017-10-06 69 views
1

我需要在Django模型表單中覆蓋clean()方法,以對輸入的數據執行額外的唯一性檢查。當在Django模型中覆蓋clean()方法時返回cleared_data

本頁面給出了實施細則: https://docs.djangoproject.com/en/1.11/ref/forms/validation/複製在這裏:

def clean(self): 
    cleaned_data = super(ContactForm, self).clean() 
    cc_myself = cleaned_data.get("cc_myself") 
    subject = cleaned_data.get("subject") 

    if cc_myself and subject: 
     # Only do something if both fields are valid so far. 
     if "help" not in subject: 
      raise forms.ValidationError(
       "Did not send for 'help' in the subject despite " 
       "CC'ing yourself." 
      ) 

但是我很困惑,爲什麼這個方法在函數結束時沒有return cleaned_data?當然,這是正確的做法?

回答

0

您感興趣的示例是覆蓋相關字段的clean方法。這意味着它驗證涉及多個字段的邏輯。將此視爲表單的clean方法。因此,在這種情況下,您不想返回任何值。

正如doc說:在實踐中執行此操作時

「小心,因爲這可能會導致混淆的形式輸出我們展示什麼是可能這裏留給了你和你的設計師合作在你的特定情況下有效運作。「

這取決於您的具體情況,但根據我的經驗,在一個特定字段上重寫clean,如果驗證通過,您將希望返回它。再次,這只是一個領域。

下面是從文檔另一個例子,但對於一個場驗證:

def clean_recipients(self): 
    data = self.cleaned_data['recipients'] 
    if "[email protected]" not in data: 
     raise forms.ValidationError("You have forgotten about Fred!") 

    # Always return a value to use as the new cleaned data, even if 
    # this method didn't change it. 
    return data 
+0

你的意思是「將此視爲窗體的」乾淨「方法」?你指的是什麼「這個」? – Rob

+0

我認爲我的問題可能是最好的答案,如果我明白了什麼其他函數使用返回的「clean_data」一旦clean()被調用?或者說,什麼是「cleared_data」? – Rob

+0

對不起,我指的是你的例子中的'clean'方法。當我說這個表格的「乾淨」方法時,它僅用於教育目的。我只想強調一下這樣一個事實,即表單是一個字段的集合,因此每個表單都有一個清晰的方法。 請按照此鏈接(https://docs.djangoproject.com/en/1.11/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other)閱讀第一個段。 – scharette

1

看一看Django的_clean_form方法:

def _clean_form(self): 
    try: 
     cleaned_data = self.clean() 
    except ValidationError as e: 
     self.add_error(None, e) 
    else: 
     if cleaned_data is not None: 
      self.cleaned_data = cleaned_data 

閱讀來自forms doc最後一顆子彈點特別是ModelForm doc的這一點。

如果clean方法產生ValidationError,則會將錯誤添加到窗體的錯誤中。 如果clean方法返回了任何內容並且沒有發生錯誤,則表單將使用它的cleaned_data屬性。否則,它會保留它的「舊」一個。

就你而言,你的clean方法所做的一切,都是驗證表單的一個方面。

相關問題