zoukankan      html  css  js  c++  java
  • form组件使用、常用字段、字段参数、自定义校验规则:

    form组件

     

    定义:

     from django import forms
     
     class RegForm(forms.Form):
         user = forms.CharField(label='用户名')
         pwd = forms.CharField(label='密码',widget=forms.PasswordInput)

    使用:

    视图函数:

     def reg2(request):
         form_obj = RegForm()
         if request.method == 'POST':
             form_obj = RegForm(request.POST)
             if form_obj.is_valid():
                 # 校验成功
                 # form_obj.cleaned_data # 清洗后的数据
                 return HttpResponse('注册成功')
     
     
         return render(request, 'reg2.html', {'form_obj': form_obj})

    模板:

     {{ form_obj.as_p }}   _>   生成所有字段的input框
     
     {{ form_obj.user }}         _> 某个字段的input框
     {{ form_obj.user.label }}   _> 某个字段的中文提示
     {{ form_obj.user.id_for_label }}   _> 某个字段的input框的ID
     
     
     {{ form_obj.errors }}   _> 所有的错误
     {{ form_obj.user.errors }} _> 某个字段的所有错误
     {{ form_obj.user.errors.0 }} _> 某个字段的第一个错误

    常用的字段

     CharField  
     ChoiceField
     MultipleChoiceField  

    字段的参数

     initial  初始值
     required 是否必填
     disabled 是否禁用
     label 中文提示
     initial   默认值
     min_length 最小长度
     error_messages   错误信息
     choices   可选择的数据

    校验

    1. 自带的校验

    2. 自定义校验规则

      1. 写函数

         from django.core.exceptions import ValidationError
         
         
         def check_name(value):
             # 自定义校验规则
             # 如果校验合格 什么都不做
             # 校验不合格   抛出异常
             if 'alex' in value:
                 raise ValidationError('不能包含alex,非法字符')
                 
    3. 使用内置的校验器

       from django.core.validators import RegexValidator
       
       validators=[RegexValidator(r'^1[3-9]d{9}$', '手机号格式不正确')]

    局部钩子和全局钩子

     def clean_user(self):
         # 局部钩子
         # 校验成功 返回当前字段的值
         # 校验不成功 抛出异常
         if 'alex' in self.cleaned_data.get('user'):
             raise ValidationError('不能包含alex,非法字符')
         return self.cleaned_data.get('user')
     
     def clean(self):
         # 全局钩子
         # 校验成功 返回所有字段的值 self.cleaned_data
         # 校验不成功 抛出异常
         pwd = self.cleaned_data.get('pwd')
         re_pwd = self.cleaned_data.get('re_pwd')
         if pwd == re_pwd:
             return self.cleaned_data
         else:
             self.add_error('re_pwd','两次密码不一致!!!')
             raise ValidationError('两次密码不一致')

     

    views:

    from django.shortcuts import render,HttpResponse

    # Create your views here.
    def reg(request):
    if request.method == "POST":
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    if len(pwd) <= 6:
    return render(request,"reg.html",{"pwd_error":"你太短了"})
    return render(request,"reg.html")

    #从数据库中获取数据之前使用models:
    from app01 import models

    #继承之前导入forms:
    from django import forms

    #定义抛出异常功能:
    from django.core.exceptions import ValidationError

    #定义校验函数:
    def check_name(value):
    #自定义校验规则 :
    #如果校验合格 什么都不做
    #校验不合格 抛出异常
    if "alex" in value:
    raise ValidationError("不能包含alex,非法字符")

    #定义django提供内置正则校验器:
    from django.core.validators import RegexValidator

    #使用form组件之前要定义类:
    class RegForm(forms.Form):
    #生成input框、默认值用initial:
    user = forms.CharField(
    #定义必填:
    required=True,
    #定义是否可以禁用:
    # disabled=True,
    label="用户名",
    initial="alex",
    #定义最小长度:
    min_length=6,
    #定义校验:
    validators=[check_name],
    #定义错误信息:error_messages
    error_messages={
    "required":"不能为空",
    "min_length":"至少为6位",
    }
    )
    #用密文需要加widget=forms.PasswordInput:
    pwd = forms.CharField(label="密码",widget=forms.PasswordInput)
    #定义确认密码功能:
    re_pwd = forms.CharField(label="确认密码",widget=forms.PasswordInput)
    #定义单选字段:
    gender = forms.ChoiceField(choices=(("1","男"),("2","女"),),initial="2")
    #定义多选字段:
    # hobby = forms.MultipleChoiceField(initial=["1","3"],choices=(("1","抽烟"),("2","喝酒"),("3","吐口水"),))
    #从数据库中获取:
    # hobby = forms.MultipleChoiceField(initial=["1","3"],choices=models.Hobby.objects.values_list("id","name"),widget=forms.CheckboxSelectMultiple)
    hobby = forms.MultipleChoiceField(initial=["1","3"],widget=forms.CheckboxSelectMultiple)
    #手机号校验:
    phone = forms.CharField(
    validators=[RegexValidator(r"^1[3-9]d{9}$","手机号格式不正确")]
    )
    def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)
    #自定义操作:
    print(self.fields)
    self.fields["hobby"].choices = models.Hobby.objects.values_list("id","name")

    #定义clean方法局部钩子:
    def clean_user(self):
    #校验成功 返回当前字段的值
    #校验不成功 抛出异常
    if "alex" in self.cleaned_data.get("user"):
    raise ValidationError("不能包含alex,非法字符")
    return self.cleaned_data.get("user")

    #定义全局钩子:
    def clean(self):
    #全局钩子
    #校验成功 返回所有字段的值 self.cleaned_data
    #校验不成功 抛出异常
    pwd = self.cleaned_data.get("pwd")
    re_pwd = self.cleaned_data.get("re_pwd")
    #判断如果相等返回所有字段的值:
    if pwd == re_pwd:
    return self.cleaned_data
    else:
    #定义添加错误的方法:
    self.add_error("re_pwd","两次密码不一致!!!!")
    raise ValidationError("两次密码不一致")

    def reg2(request):
    #拿到form对象:
    form_obj = RegForm()
    if request.method == "POST":
    form_obj = RegForm(request.POST)
    #校验用is_valid:
    if form_obj.is_valid():
    print(request.POST)
    print(form_obj.cleaned_data,type(form_obj.cleaned_data))
    return HttpResponse("注册成功")
    return render(request,"reg2.html",{"form_obj":form_obj})

    reg.html:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>

    <form action="" method="post">
    {# 加% csrf_token %}作用是可以提交post请求:#}
    {% csrf_token %}
    <p>
    用户名:<input type="text" name="user">
    </p>
    <p>
    密码:<input type="password" name="pwd"><span>{{ pwd_error }}</span>
    </p>
    <button>注册</button>
    </form>
    </body>
    </html>

    reg2:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>

    <form action="" method="post" novalidate>
    {% csrf_token %}
    {# {{ form_obj.as_p }}#}
    <p>
    <label for="{{ form_obj.user.id_for_label }}">{{ form_obj.user.label }}</label>
    {# 生成input框用对象点:#}
    {{ form_obj.user }}<span> {{ form_obj.user.errors.0 }} </span>
    </p>
    <p>
    <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
    {{ form_obj.pwd }}<span>{{ form_obj.pwd.errors.0 }}</span>
    </p>
    <p>
    <label for="{{ form_obj.re_pwd.id_for_label }}">{{ form_obj.re_pwd.label }}</label>
    {{ form_obj.re_pwd }}<span>{{ form_obj.re_pwd.errors.0 }}</span>
    </p>
    <p>
    <label for="{{ form_obj.gender.id_for_label }}">{{ form_obj.gender.label }}</label>
    {{ form_obj.gender }}
    </p>
    <p>
    <label for="{{ form_obj.hobby.id_for_label }}">{{ form_obj.hobby.label }}</label>
    {{ form_obj.hobby }}
    </p>
    <p>
    <label for="{{ form_obj.phone.id_for_label }}">{{ form_obj.phone.label }}</label>
    {{ form_obj.phone }}<span>{{ form_obj.phone.errors.0 }}</span>
    </p>
    {{ form_obj.errors }}
    <button>注册</button>
    </form>
    </body>
    </html>
  • 相关阅读:
    ffmpeg合并视频+音频
    You-Get和youtube-dl
    【会声会影】初装会声会影时,必要的设置
    【会声会影】视频导出、输出时,如何设置参数
    【会声会影】导入的srt字幕文件,如何快速批量调整字体及大小
    把h264文件快速包装成mp4格式
    Notepad++正则表达式——去掉srt字幕文件的时间轴
    百度地图API的网页使用
    ASPCMS_判断语句if标签的使用
    Grid布局
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12112476.html
Copyright © 2011-2022 走看看