Django中modelform的使用
django中,通常model和form有很多相似的字段,多次雷同的定義是有點坑爹,還好看到了modelform,記錄一下用法,例如有下面一個model
class EmailVerifyRecord(models.Model):
code = models.CharField(max_length=20, verbose_name=u'驗證碼')
email = models.EmailField(max_length=20, verbose_name=u'郵箱')
class Meta:
verbose_name = u'郵箱驗證'
verbose_name_plural = verbose_name
def __unicode__(self):
return self.code + '(' + self.email + ')'
我們定義form的時候,可以以如下的方式定義
class EmailVerifyRecordForm(forms.ModelForm):
class Meta:
model = EmailVerifyRecord
相當簡潔,而且還能像如下的方式選擇想要的字段以及添加更多的字段
class EmailVerifyRecordForm(forms.ModelForm):
new_field = forms.CharField()
class Meta:
model = EmailVerifyRecord
fields = ['code']
除此之外,modelform在驗證的時候,可以自定義對相應的字段進行驗證,例如
class EmailVerifyRecordForm(forms.ModelForm):
new_field = forms.CharField()
class Meta:
model = EmailVerifyRecord
fields = ['code']
def clean_code(self):
code = self.cleaned_data['code']
if 'a' in code:
return code
else:
raise forms.ValidationError(u'code 包含了a,不合法', code='code invalid')
這樣,在調用如下代碼的時候
myform =ValidationError(request.POST)
if myform.is_valid():
print ('通過驗證')
else:
print ('未通過驗證')
當code包含a就不會通過驗證了,另外,相對於普通的form,modelform多了一個save方法,調用相當於調用的是model的sava方法,只要記得sava方法中傳入參數commit=True就可以直接保存數據到數據庫,如果不傳,就像py3的pymysql執行了不提交一樣,不會保存到數據庫