Django組件-forms
阿新 • • 發佈:2019-01-16
rgba shortcuts lse request oct ima ctype cor col
forms組件
一、app01.models.py
?1 2 3 4 5 6 7 8 9 10 |
from django.db import models
class UserInfo(models.Model):
nid = models.BigAutoField(primary_key = True )
name = models.CharField(verbose_name = ‘用戶名‘ , max_length = 32 , unique = True )
pwd = models.CharField(verbose_name = ‘密碼‘ , max_length = 64 )
email = models.EmailField(verbose_name = ‘郵箱‘ , unique = True )
tel = models.CharField(verbose_name = ‘手機‘ )
avatar = models.ImageField(verbose_name = ‘頭像‘ )
create_time = models.DateTimeField(verbose_name = ‘創建時間‘ , auto_now_add = True )
|
二、app01.myforms.py
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
from django import forms
from django.forms import widgets
from app01.models import UserInfo
from django.core.exceptions import ValidationError
class RegisterForm(forms.Form):
name = forms.CharField(
min_length = 6 ,
max_length = 32 ,
label = "用戶名" ,
error_messages = {
"required" : "用戶名不能為空" ,
"min_length" : "用戶名長度不能小於6個字符" ,
"max_length" : "用戶名長度不能大於32個字符" },
widget = widgets.TextInput(attrs = { "class" : "form-control" })
)
pwd = forms.CharField(
min_length = 6 ,
max_length = 32 ,
label = "密碼" ,
error_messages = { ‘required‘ : ‘密碼不能為空.‘ },
widget = widgets.PasswordInput(attrs = { "class" : "form-control" })
)
r_pwd = forms.CharField(
min_length = 6 ,
max_length = 32 ,
label = "確認密碼" ,
error_messages = { "required" : "密碼不能為空" },
widget = widgets.TextInput(attrs = { "class" : "form-control" })
)
email = forms.EmailField(
label = "郵箱" ,
error_messages = { "required" : "郵箱不能為空" , "invalid" : "格式錯誤" },
widget = widgets.TextInput(attrs = { "class" : "form-control" })
)
tel = forms.CharField(
label = "手機號" ,
widget = widgets.TextInput(attrs = { "class" : "form-control" })
)
# 局部鉤子
def clean_name( self ):
val = self .cleaned_data.get( "name" )
ret = UserInfo.objects. filter (name = val)
if not ret:
return val
else :
raise ValidationError( "該用戶已註冊!" )
def clean_email( self ):
val = self .cleaned_data.get( "email" )
ret = UserInfo.objects. filter (email = val)
if not ret:
return val
else :
raise ValidationError( "該郵箱已註冊!" )
def clean_tel( self ):
val = self .cleaned_data.get( "tel" )
if len (val) = = 11 :
return val
else :
raise ValidationError( "手機號格式錯誤" )
# 全局鉤子
def clean( self ):
pwd = self .cleaned_data.get( ‘pwd‘ )
r_pwd = self .cleaned_data.get( ‘r_pwd‘ )
if pwd and r_pwd:
if pwd = = r_pwd:
return self .cleaned_data
else :
# raise ValidationError(‘兩次密碼不一致‘) # 加在全局的錯誤裏面 form.errors.get("__all__")
self .add_error( "r_pwd" , ValidationError( ‘兩次密碼不一致‘ )) #加在r_pwd的錯誤裏
else :
return self .cleaned_data
|
三、app01.views.py
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from django.shortcuts import render,HttpResponse
from app01.myforms import *
def reg(request):
if request.method = = "POST" :
form = RegisterForm(request.POST) # form表單的name屬性值應該與forms組件字段名稱一致
if form.is_valid(): # 驗證成功做什麽
form.cleaned_data.pop( ‘r_pwd‘ )
user_info = form.cleaned_data
UserInfo.objects.create( * * user_info)
request.session[ ‘user_info‘ ] = user_info
return redirect( ‘/‘ )
else :
return render(request, "reg.html" , locals ())
form = RegisterForm()
return render(request, "reg.html" , locals ())
‘‘‘
form=UserForm({"name":"bubu","email":"[email protected]","xxxx":"123123123"}) :xxxx字段不會驗證,只驗證UserForm類裏面有的字段
form.is_valid() :返回布爾值
form.cleaned_data :所有幹凈的字段以及對應的值{"name":"bubu","email":"[email protected]"}
form.errors :ErrorDict : {"校驗錯誤的字段":["錯誤信息",]}
form.errors.get("name") :ErrorList ["錯誤信息",]
form.errors.get("name")[0] :取出第一個錯誤信息
全局鉤子錯誤
forms中:
raise ValidationError(‘兩次密碼不一致‘) #加在全局的錯誤裏面 form.errors.get("__all__")
self.add_error("r_pwd", ValidationError(‘兩次密碼不一致‘))
views.py中:errors=form.errors.get("__all__")
模板中:<span>{{ errors.0 }}</span>
‘‘‘
|
四、templates.reg.html
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<! DOCTYPE html>
< html lang="en">
< head >
< meta charset="UTF-8">
< title >Title</ title >
< style >
.error{
color: red;
}
.register {
width: 400px;
margin-top: 20px;
margin-left: auto;
margin-right: auto;
border: 1px solid #f0f0f0;
padding: 10px 30px 50px 30px;
-webkit-box-shadow: 5px 10px 10px rgba(0, 0, 0, .05);
box-shadow: 5px 10px 10px rgba(0, 0, 0, .05);
}
.register h3{font-size: 25px; text-align: center;font-weight: bold;}
</ style >
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
< link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</ head >
< body >
< div class="register">
< h3 >用戶註冊</ h3 >
< form action="" method="post" novalidate>
{% csrf_token %}
< div class="form-group">
< label for="">{{ form.name.label }}</ label >
{{ form.name }} < span class="pull-right error">{{ form.name.errors.0 }}</ span >
</ div >
< div class="form-group">
< label for="">{{ form.pwd.label }}</ label >
{{ form.pwd }} < span class="pull-right error">{{ form.pwd.errors.0 }}</ span >
</ div >
< div class="form-group">
< label for="">確認密碼</ label >
{{ form.r_pwd }} < span class="pull-right error">{{ form.r_pwd.errors.0 }}</ span >< span class="pull-right error">{{ errors.0 }}</ span >
</ div >
< div class="form-group">
< label for="">郵箱</ label >
{{ form.email }} < span class="pull-right error">{{ form.email.errors.0 }}</ span ></ div >
< div class="form-group">
< label for="">手機號</ label >
{{ form.tel }} < span class="pull-right error">{{ form.tel.errors.0 }}</ span ></ div >
< input type="submit" class="btn btn-default" value="註冊"/>
</ form >
<!--
<h3>forms組件渲染方式2</h3>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{{ field }} <span class="pull-right error">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" class="btn btn-default" value="註冊"/>
</form>
<h3>forms組件渲染方式3</h3>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="btn btn-default" value="註冊"/>
</form>
-->
</ div >
</ body >
</ html >
|
Django組件-forms