ModelForm组件的简单使用
models.py
from django.db import models class UserInfo(models.Model): username = models.CharField(max_length=32) email = models.EmailField(max_length=32) phone = models.CharField(max_length=32) password = models.CharField(max_length=64) def __str__(self): return self.username
forms.py
import re from django import forms from django.forms import widgets as form_widgets from account.models import UserInfo class RegisterForm(forms.ModelForm): password = forms.CharField( min_length=6,max_length=32, error_messages={ 'required':'密码不能为空', 'min_length':'密码长度必须大于6小于32', 'max_length':'密码长度必须大于6小于32', }, widget=forms.PasswordInput() ) password_confirmed = forms.CharField( error_messages={'required':'确认密码不能为空'}, widget=forms.PasswordInput() ) class Meta: model = UserInfo fields = '__all__' error_messages = { 'username':{ 'required': '用户名不能为空', }, 'email': { 'required': '邮箱地址不能为空', 'invalid': '邮箱地址格式错误', }, 'phone': { 'required': '电话号码不能为空', }, } widgets = { 'username':form_widgets.TextInput(), 'email':form_widgets.EmailInput(), 'phone':form_widgets.TextInput(), } def __init__(self, *args, **kwargs): super(RegisterForm, self).__init__(*args, **kwargs) def clean_username(self): value = self.cleaned_data['username'] patten = re.compile(r'^[a-zA-Z0-9.@_]{2,16}$') if not patten.match(value): raise forms.ValidationError('用户名应该是由大小写字母/数字/特俗符号组成(.@_)的2到16位字符串') return value def clean_phone(self, ): value = self.cleaned_data['phone'] patten = re.compile(r'^(13[0-9]|14[5-9]|15[0-3,5-9]|16[2,5,6,7]|17[0-8]|18[0-9]|19[1,3,5,8,9])[0-9]{8}$') if not patten.match(value): raise forms.ValidationError('手机号码格式错误') if UserInfo.objects.filter(phone=value).count(): raise forms.ValidationError('手机号码已经存在') return value def clean(self): password = self.cleaned_data.get("password") password_confirmed = self.cleaned_data.get("password_confirmed") if password != password_confirmed: self.add_error('password_confirmed', forms.ValidationError('密码不一致')) return self.cleaned_data return self.cleaned_data
views.py
from django.shortcuts import render from django.views import View from account.forms import RegisterForm from django.shortcuts import render, redirect from django.core.urlresolvers import reverse class RegisterView(View): def get(self,request): context = { 'form':RegisterForm() } return render(request, 'register.html', context) def post(self,request): form = RegisterForm(request.POST) if form.is_valid(): form.save() return redirect(reverse('account:index')) return render(request, 'register.html', {'form':form}) class IndexView(View): def get(self,request): return render(request,'index.html')
register.html
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="POST" novalidate> {% csrf_token %} <p> 用户名:{{ form.username }} {{ form.errors.username.0 }} </p> <p> 密码:{{ form.password }} {{ form.errors.password.0 }} </p> <p> 确认密码:{{ form.password_confirmed }} {{ form.errors.password_confirmed.0 }} </p> <p> 邮箱:{{ form.email }} {{ form.errors.email.0 }}</p> <p> 手机:{{ form.phone }} {{ form.errors.phone.0 }}</p> <input type="submit" value="提交" /> </form> </body> </html>