Djang之ModelForm组件的简单使用
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>
作者:Standby — 一生热爱名山大川、草原沙漠,还有我们小郭宝贝!
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号