博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
$Django Form组件
阅读量:5211 次
发布时间:2019-06-14

本文共 8254 字,大约阅读时间需要 27 分钟。

forms组件
 -forms是什么?
  就是一个类,可以校验字段(前台传过来的字段)
 -怎么用:
 ***   
{#浏览器的格式校验提示   novalidate取消提示: 可以提交 格式不符合浏览器格式 的数据    #}
            <form method="post"
novalidate></form>
 ***总结
  
from django import forms from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django.forms import widgets from django.http import JsonResponse class MyForm(forms.Form):     name=forms.CharField(max_length=8,min_length=3,widget=widgets.TextInput(attrs={'placeholder':'输入用户名','class':'form-control name'}),label='用户名:',error_messages={'max_length':'不能过8位'})     pwd=forms.CharField(max_length=8,min_length=3,widget=widgets.PasswordInput(attrs={'placeholder':'输入密码','class':'form-control pwd'}),label='密码',error_messages={'min_length':'不能少于3位'})     pwd2=forms.CharField(max_length=8,min_length=3,widget=widgets.PasswordInput(attrs={'placeholder':'重复密码','class':'form-control pwd2'}),label='重复密码',error_messages={'min_length':'不能少于3位'})     email=forms.EmailField(widget=widgets.EmailInput(attrs={'placeholder':'输入邮箱','class':'email form-control'}),label='邮箱',error_messages={})     tim=forms.DateTimeField(widget=widgets.TimeInput(attrs={'class':'form-control tim','placeholder':'输入时间'}),label='时间')     def clean_name(self):         name=self.cleaned_data.get('name')         if name=='123':             raise ValidationError('名字错误1')         return name     def clean(self):         pwd=self.cleaned_data.get('pwd')         pwd2=self.cleaned_data.get('pwd2')         if pwd==pwd2:             return self.cleaned_data         else:             raise ValidationError('密码不一致') def ss(request):     if request.method=='GET':  dic={'name':'123','pwd':'45w','pwd2':'45aa','email':"123@qq.com",'tim':'2018-10-19 00:00:00','age':18}         f=MyForm(dic)         # print(f.cleaned_data) #报错 因为是校验后的数据         if f.is_valid(): #MyForm内【所有的字段】 第一次校验格式通过了 【再进行】  第二次逻辑校验了通过 走下面             print('校验成功字段1',f.cleaned_data)         else:#有一个字段,有一次校验没通过 走这里             print('校验成功段',f.cleaned_data)             print('所有失败的字段',f.errors.as_data())             #取出逻辑错误字段(错误种可能只有格式错误,所以要try)             #【第一次格式都没通过】,【不会进行/不存】在逻辑的【校验/错误】 2次密码格式都没通过只会报格式错误             try:                 all=f.errors.as_data().get('__all__')[0]                 print(type(all))             except Exception:                 all=''         return render(request,'ss.html')
  【视图函数部分】
 -校验字段功能:
  -先写一个类,继承Form
  from django.shortcuts import render, HttpResponse
 
 from django import forms
 
from django.core.exceptions import NON_FIELD_ERRORS,
ValidationError   
 
  # 写一个类,要校验那些字段,就是类的属性
  class MyForm(forms.Form):
   # 定义一个属性,可以用来校验字符串类型
   # 限制最大长度是8,最小长度是3
 
name=forms.CharField(max_length=8,min_length=3,label='用户名:',widget=widgets.TextInput(attrs={'class':'form-control name1',' placeholder':'大于3位小于8位'}),error_messages={'max_length':'不能超过8位数','min_length':'不能少于3位数','required':'*必填'})
   pwd=forms.CharField(max_length=8,min_length=3,required=True)
 
   # 校验是否是邮箱格式
   email=forms.EmailField() # errors_messages有个
'invalid':'邮箱地址格式错误'
  def login(request):
   #实例化产生对象,传入要校验的数据(字典)
   
myform=MyForm(request.POST)
   # is_valid如果是true表示校验成功,反之,校验失败
  
 #校验失败的信息(  总的一个失败的信息  )
    print(
myform.errors)     #标签形式的错误信息
  print(
myform.errors.as_data()) #字典形式的错误信息
   if
myform.is_valid():
(第一层校验的字段 通过)
    # 校验通过的数据
    print(
myform.cleaned_data)
    return HttpResponse('校验成功')
   else:
    print(
myform.cleaned_data)
   return render(request,'login.html',local())
 【template层】   
  -注意:校验字段可以多,但是不能少
     传过来的字典必须有form类的校验字段 少了
 -渲染模板
  -
第一中方式:(灵活性最高)
   <form action="" method="post" >
    <p>用户名: {
{ myform.name }}</p>
    <p>密码: {
{ myform.pwd }}</p>
    <p>邮箱: {
{ myform.email }}</p>
    <input type="submit" value="提交">
   </form>
  -
第二种方式:for循环form对象(用的比较多):
  
 <form action="" method="post" >
    {% for foo in myform %}
     <p>{
{ foo.label }}:{
{ foo }}</p><span>{
{  foo.errors.0  }}</span> #渲染错误信息
    {% endfor %}
    <input type="submit" value="提交">
   </form>
  
-第三种方式(不建议用):
   <form action="" method="post" >
  {#    {
{ myform.as_p }}#}
   {
{ myform.as_ul }}
   <input type="submit" value="提交">
   </form>
   
 -渲染错误信息(
第一层校验(报错的字段   不会进行第二次校验))
                              
错误信息都在 myform({字典}).errors.as_data() 字典内包含了1,2层 (有1的一层 没2层)
  - myforms有errors
  -属性(name)也有errors
  -错误信息,变成中文:
   - error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填','invalid': '不符合邮箱格式'}
  -给input标签指定样式,指定格式:
    -widget=widgets.TextInput(attrs={'class':'form-control'})
  -模板,
渲染第一层错误信息:<span>{
{ myform.name.errors.0 }}</span>
  
 -
局部钩子校验(
第二层校验
  -定义一个函数,名字叫:clean_字段名字,内部,取出该字段,进行校验,如果通过,将该字段返回,如果失败,抛异常(ValidationError)
  -  
def clean_name(self):
    # self:当前form对象
    name = self.cleaned_data.get('name')
    if name.startswith('sb'):
     # 失败,抛异常
     raise ValidationError('不能以傻逼开头')
    # 正常,把name返回
    return name
 -
全局钩子 (
第二层校验
  #重写clean方法
  
def clean(self):
   #程序能走到该函数,前面校验已经通过了,所以可以从cleaned_data中取出密码和确认密码  
   pwd=self.cleaned_data.get('pwd')
   re_pwd=self.cleaned_data.get('re_pwd')
   #进行自己的校验
   if pwd==re_pwd:
    #通过,直接返回cleaned_data
    return self.cleaned_data
   else:
    #失败,抛异常(ValidationError)
    raise ValidationError('两次密码不一致')
 
 
 
 
 
 
 
from django import forms from django.core.exceptions import NON_FIELD_ERRORS, ValidationError class Myform(forms.Form):     from django.forms import widgets     name=forms.CharField(max_length=8,min_length=3,label='用户名:',widget=widgets.TextInput(attrs={'class':'form-control name1',' placeholder':'大于3位小于8位'}),error_messages={'max_length':'不能超过8位数','min_length':'不能少于3位数','required':'*必填'})     pwd=forms.CharField(max_length=8,min_length=3,label='密码:',widget=widgets.PasswordInput(attrs={'class':'form-control pwd1','placeholder':'大于3位小于8位'}),error_messages={'max_length':'不能超过8位数','min_length':'不能少于3位数','required':'*必填',})     r_pwd=forms.CharField(max_length=8,min_length=3,label='确认密码:',widget=widgets.PasswordInput(attrs={'class':'form-control pwd2','placeholder':'大于3位小于8位'}),error_messages={'max_length':'不能超过8位数','min_length':'不能少于3位数','required':'*必填'})     email=forms.EmailField(widget=widgets.EmailInput(attrs={'class':'form-control email1','placeholder':'例如:www@qq.com'}),error_messages={'required':'不能为空','invalid':'邮箱地址格式错误'})     #'invalid':'格式错误'邮箱的格式     # 钩子:在上面error-messages格式校验之后  再次进行的数据校验(上面name数据格式没通过(前台显示错误),不会进行name数据校验.两个错误是独立的)     # 局部钩子     def clean_name(self):         name=self.cleaned_data.get('name')         names=models.Info.objects.only('name')         names=[i.name for i in names]         if name in names:             raise ValidationError('姓名已存在')         return name     # 全局钩子     def clean(self):         pwd=self.cleaned_data.get('pwd')         r_pwd=self.cleaned_data.get('r_pwd')         if pwd!=r_pwd:             raise ValidationError('密码不一致')         return self.cleaned_data def form(request):     if request.method=='GET':         myform=Myform()     elif request.method=='POST':         myform=Myform(request.POST)         print (myform.errors.as_data ())  #所有的  错误信息(字段格式错误信息  局部钩子 全局钩子信息)         if myform.is_valid():                 #通过格式校验             print('true',myform.cleaned_data) #格式  通过的数据{'name': '王冬123', 'pwd': 'bbbbbb', 'r_pwd': 'cccccc', 'email': '279829702@qq.com'}             return redirect('http://www.baidu.com')         else:             print('else',myform.cleaned_data) #格式  通过的数据             print(myform.errors) #type()为一个继承了dict的类             # ul class="errorlist">
  • name
    • 不能少于3位数
  • pwd
    • 不能少于3位数
  • r_pwd
    • 不能少于3位数
  • email
    • 邮箱地址格式错误
  • print (myform.errors.as_data ()) #{'name': [ValidationError(['不能少于3位数'])], 'pwd': [ValidationError(['不能少于3位数'])], 'r_pwd': [ValidationError(['不能少于3位数'])], 'email': [ValidationError(['邮箱地址格式错误'])]} try: all=myform.errors.as_data ().get('__all__')[0] print(all) except Exception: pass return render(request,'form.html',locals())
           
    Title

    注册

    {#浏览器的格式校验提示 novalidate取消提示: 可以提交格式不符合的数据 #}
    {% for foo in myform %}
    {
    { foo.label }}{
    { foo }}
    { { foo.errors.0 }}
    {% endfor %}
    {
    { all.0 }}

    转载于:https://www.cnblogs.com/3sss-ss-s/p/9996947.html

    你可能感兴趣的文章
    知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
    查看>>
    CSS背景颜色、背景图片、平铺、定位、固定
    查看>>
    口胡:[HNOI2011]数学作业
    查看>>
    我的第一个python web开发框架(29)——定制ORM(五)
    查看>>
    Combination Sum III -- leetcode
    查看>>
    中国剩余定理
    查看>>
    刘汝佳,竖式问题
    查看>>
    hdu--1029--思维题
    查看>>
    NSMutable sort排序
    查看>>
    基础笔记一
    查看>>
    uva 10137 The trip
    查看>>
    spring 解决中文乱码问题
    查看>>
    一个简单的WCF开发实例
    查看>>
    poj 1743 Musical Theme 后缀数组
    查看>>
    Maven 介绍
    查看>>
    hdu 4268
    查看>>
    启动tomcat时cmd窗口一闪而过
    查看>>
    两个有序数列,求中间值 Median of Two Sorted Arrays
    查看>>
    vue路由的实现原理
    查看>>
    Java核心技术:Java异常处理
    查看>>