我想所有的業務邏輯相關的驗證移到模型,而不是讓他們在表單中。但在這裏我有一個棘手的情況,爲此我想諮詢SO社區。確實Django模型提供類似形式的clean_ <fieldname>()的東西嗎?
在我SignupForm(模型的形式),我有以下具體領域的驗證,以確保輸入的電子郵件不存在。
def clean_email(self):
email = self.cleaned_data['email']
if ExtendedUser.objects.filter(email=email).exists():
raise ValidationError('This email address already exists.')
return email
如果我是這個驗證移到模型,根據官方的文檔,我會把它放進相應的模型,ExtendedUser
的clean()
。但是,文檔還提到了以下內容:由Model.clean(提出
任何ValidationError例外)將被存儲在 一個特殊的鍵錯誤辭典鍵,NON_FIELD_ERRORS,用來 對於那些依賴於整個錯誤模型而不是一個特定的 場
這意味着,與clean()
,我不能從它與具體領域提出的錯誤關聯。我想知道模型是否提供了與表單'clean_<fieldname>()
類似的東西。如果不是,你會在哪裏放置驗證邏輯,爲什麼?
」不是個這個邏輯與形式相關嗎?你爲什麼認爲它會更好地生活在模型中?在我看來,這將是django中模型的預期用法。 – vascop 2012-03-22 00:30:38
@VascoP - 我只是想將所有業務邏輯集中在模型中。首先,它在設計方面更加有組織。從概念上講,我認爲驗證生活在模型中是有意義的。此外,當我有基於相同模型的多個模型表單時,它具有共享相同驗證的好處。 – tamakisquare 2012-03-22 00:49:33
您也可以繼承與給定模型相關的更一般的模型,併爲每個不同的表單創建子模型。 – vascop 2012-03-22 00:55:54