Django中modelform的使用

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執行了不提交一樣,不會保存到數據庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章