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 == "badboy@163.com":   #此部分可以扩展,将其数据从用户注册表中取出
            self._errors['email'] = self.error_class([u"邮箱已经存在,请换一个!"])
        return cleaned_data 

以上仅供参考!



本文转自hahazhu0634 51CTO博客,原文链接:http://blog.51cto.com/5ydycm/1654629,如需转载请自行联系原作者

相关文章
|
存储 缓存 数据库
Django框架学习(四)
Django框架学习(四)
|
前端开发 关系型数据库 MySQL
Django框架学习(三)
Django框架学习(三)
|
JSON 前端开发 数据库
Django框架学习(一)
Django框架学习(一)
|
4月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
334 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
8月前
|
编解码 前端开发 JavaScript
技术经验分享:Django学习日记
技术经验分享:Django学习日记
|
4月前
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
49 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
|
4月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
165 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
【Django学习】(十六)session_token认证过程与区别_响应定制
【Django学习】(十六)session_token认证过程与区别_响应定制
|
9月前
|
Python
Django 学习教程-介绍与安装
本章介绍了Django是什么,以及为什么使用Django和安装Django
87 1
Django 学习教程-介绍与安装
|
9月前
|
调度 Apache 数据库
Django 学习教程-第一个 Django 应用
本章主要讲述了如何创建一个Django项目,以一个投票案例程序介绍了Django的请求和响应流程。
104 1