Django學習系列之ModelForm

前面兩篇寫了有關Form與Form的驗證,今天我們來寫些ModelForm,因爲現在的web開發都基與db驅動的,所以models.py的定義是少不掉的,但我們會發現它的定義與forms.py定義很接近,爲此減少輸入,我們可以使用modelForm這個模塊,可減少代碼輸入。


先定義models.py

#coding:utf-8
from django.db import models

SEX_CHOICES=(
('male','男'),
('female','女')
)

class Register(models.Model):
    sn = models.CharField(max_length=30,blank=True)
    nickname = models.CharField(max_length=50)
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    sex = models.CharField(max_length=10,choices=SEX_CHOICES,null=True,blank=True)
    email = models.EmailField(max_length=50)
    phone = models.CharField(max_length=30,null=True,blank=True)
    birthday = models.DateField(max_length=50,null=True,blank=True)

    def __unicode__(self):
        return self.nickname


    class Meta:
        ordering = ('-sn',)    #排序

    
    #def clean(self):    #此部分本來是用來驗證的,但想想還是將驗證放到forms.py中吧。
    #    print self.nickname

再定義forms.py

#coding:utf-8
from django import forms
from mysite.models import Register
from django.core.exceptions import ValidationError
from django.forms.extras.widgets import SelectDateWidget

SEX_CHOICES=(
('male','男'),
('female','女')
)

BIRTH_YEAR_CHOICES = ('1980', '1981', '1982','1983','1984')

def validate_phone(value):
    if not value.isdigit():
        raise ValidationError(u'%s不是電話號碼' % value)
    

class RegisterForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput(attrs={'id':'pass'}))
    sex = forms.ChoiceField(widget=forms.RadioSelect,choices=SEX_CHOICES)
    birthday = forms.DateField(required=False,widget=SelectDateWidget(years=BIRTH_YEAR_CHOICES))
    phone = forms.CharField(required=False,validators=[validate_phone])

    class Meta:
        model = Register
        #fields = ['nickname','username','password','phone']
        fields = '__all__'

    def clean(self):
        cleaned_data=super(RegisterForm,self).clean()  
        nick_name=cleaned_data.get('nickname')  
        username = cleaned_data.get('username')
        password = cleaned_data.get('password')
        email = cleaned_data.get('email')        

        if not nick_name:
            self._errors['nickname'] = self.error_class([u"請輸入別名!"])

        if not username:
            self._errors['username'] = self.error_class([u"請輸入用戶名!"])
 
        if not password:
            self._errors['password'] = self.error_class([u"請輸入密碼!"])

        if nick_name == username and nick_name:
            self._errors['nickname'] = self.error_class([u"別名與用戶名不能一樣!"])

        if not email:
            self._errors['email'] = self.error_class([u"請輸入正確郵箱!"])

        if email == "[email protected]":   #此部分可以擴展,將其數據從用戶註冊表中取出
            self._errors['email'] = self.error_class([u"郵箱已經存在,請換一個!"])
        return cleaned_data

以上僅供參考!


如果想了解更多,請關注我們的公衆號
公衆號ID:opdevos
掃碼關注

gongzhouhao.jpg

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