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>
  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12112476.html
Copyright © 2011-2022 走看看