day73-01 form组件

it2025-02-09  31

目录

1 校验字段功能2 渲染标签功能渲染方式1渲染方式2渲染方式3 3 渲染错误信息功能视图模板 4 组件的参数配置5 局部钩子6 全局钩子

1 校验字段功能

针对一个实例:注册用户讲解。

模型

models.py

from django.db import models class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) email=models.EmailField()

模板文件

html.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <div> <label for="user">用户名</label> <p><input type="text" name="name" id="name"></p> </div> <div> <label for="pwd">密码</label> <p><input type="password" name="pwd" id="pwd"></p> </div> <div> <label for="r_pwd">确认密码</label> <p><input type="password" name="r_pwd" id="r_pwd"></p> </div> <div> <label for="email">邮箱</label> <p><input type="text" name="email" id="email"></p> </div> <input type="submit"> </form> </body> </html>

视图函数

app01forms.py

# forms组件 from django import forms from django.forms import widgets wid_01 = widgets.TextInput(attrs={'class': 'form-control'}) wid_02 = widgets.PasswordInput(attrs={'class': 'form-control'}) class UserForm(forms.Form): name=forms.CharField(max_length=32,widget=wid_01) pwd = forms.CharField(max_length=32, widget=wid_02) r_pwd=forms.CharField(max_length=32,widget=wid_02) email=forms.EmailField(widget=wid_01)

views.py

from django.shortcuts import render,HttpResponse from app01 import appp01forms def register(request): if request.method=="POST": form=UserForm(request.POST) if form.is_valid(): print(form.cleaned_data) # 所有干净的字段以及对应的值 else: print(form.cleaned_data) # print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]} print(form.errors.get("name")) # ErrorList ["错误信息",] return HttpResponse("OK") form=UserForm() return render(request,"register.html",locals())

路由配置

url(r'^register/', views.register),

2 渲染标签功能

渲染方式1

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 最新版本的 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> <h3>注册页面</h3> <div class="container"> <div class="row"> <div class="col-md-6 col-lg-offset-3"> <form action="" method="post"> <div> <label for="">用户名</label> {{ form.name }} </div> <div> <label for="">密码</label> {{ form.pwd }} </div> <div> <label for="">确认密码</label> {{ form.r_pwd }} </div> <div> <label for=""> 邮箱</label> {{ form.email }} </div> <input type="submit" class="btn btn-default pull-right"> </form> </div> </div> </div> </body> </html>

渲染方式2

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"> <title>Document</title> </head> <body> <div class="col-md-6 col-md-offset-3"> <form action="" method="post"> {% for file in form %} <div> <label for="">{{ file.label }}</label> {{ file }} </div> {% endfor %} <input type="submit" class="btn btn-info pull-right"> </form> </div> </body> </html>

渲染方式3

<form action="" method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" class="btn btn-default pull-right"> </form>

3 渲染错误信息功能

视图

from django.shortcuts import render,HttpResponse from app01 import appp01forms def register(request): if request.method=="POST": form=UserForm(request.POST) if form.is_valid(): print(form.cleaned_data) # 所有干净的字段以及对应的值 else: print(form.cleaned_data) # print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]} print(form.errors.get("name")) # ErrorList ["错误信息",] return HttpResponse("OK") form=UserForm() return render(request,"register.html",locals())

模板

<form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div> <label for="">{{ field.label }}</label> {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span> </div> {% endfor %} <input type="submit" class="btn btn-default"> </form>

4 组件的参数配置

from django.forms import widgets wid_01 = widgets.TextInput(attrs={'class': 'form-control'}) wid_02 = widgets.PasswordInput(attrs={'class': 'form-control'}) class UserForm(forms.Form): name=forms.CharField(max_length=10,min_length=2,label='用户名', error_messages={'required':'该字段不能为空','invaild':'格式错误', 'max_length':'太长','mim_length':'太短'} ,widget=wid_01) pwd = forms.CharField(max_length=10,min_length=2, widget=wid_02) r_pwd=forms.CharField(max_length=10,min_length=2,widget=wid_02) email=forms.EmailField(widget=wid_01,label='邮箱',error_messages={'required':'该字段不能为空', 'invaild':'格式错误'})

5 局部钩子

from django.forms import ValidationError # 更复杂的校验,姓名不能以sb开头 # 局部钩子(写一个方法,方法名叫 clean_字段名) # 一旦能走到这个方法中,说明前面的校验已经通过了 # 1 在自定义的Form类中写 clean_字段名 # 2 取出字段的真正值,name=self.cleaned_data.get('name') # 3 判断自己的规则,如果判断失败,抛出ValidationError # 4 如果通过,return name def clean_name(self): # name对应的值,如何取到? name = self.cleaned_data.get('name') if name.startswith('sb'): # 不让校验通过 raise ValidationError('不能以sb开头') else: # 校验通过,返回name return name

6 全局钩子

# 只要走到它,前面,字段自己的校验和局部钩子校验都通过了 def clean(self): # name=self.cleaned_data.get('name') # print(name) password = self.cleaned_data.get('password') re_password = self.cleaned_data.get('re_password') if password == re_password: return self.cleaned_data # return {'lqz':"nb"} else: raise ValidationError('两次密码不一致')
最新回复(0)