zoukankan      html  css  js  c++  java
  • Django中的form表单

    1,手写一个form表单提交数据

    • 有input标签,让用户可以填数据
    • 校验form表单提数据
    • 提示错误信息

    html页面代码:

    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <title>注册</title>
    </head>
    <body>
    <h1>form表单中的注册</h1>
    <form action="" method="post">
        {% csrf_token %}  {# 跨站请求伪造 #}
        <p>用户名:
            <input type="text" name="user"><span style="color:red">{{ error_name }}</span>
        </p>
        <p>密码:
            <input type="password" name="pwd"><span style="color:red">{{ error_pwd }}</span>
        </p>
        <input type="submit">
    </form>
    </body>
    </html>

     view业务逻辑的代码:

    from django.shortcuts import render, HttpResponse
    from django import forms
    # Create your views here.
    
    
    class RegForm(forms.Form):
        user = forms.CharField(max_length=32)
        pwd = forms.CharField(max_length=32)
    
    
    def login(request):
        # 全局定义变量的值,第一次是get请求的时候需要有值
        error_name = ""
        error_pwd = ""
        # 第二次进来是POST请求要提交数据
        if request.method == "POST":
            print(123)
            # 获取到用户输入的值
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            print(user)
            print(pwd)
            # 拿到数据后进行数据判断
            if len(user) > 6 and len(pwd) > 6:
                # 数据符合要求,进行注册成功的操作,这里就先返回一个HttpResponse对象
                return HttpResponse("注册成功")
    
            elif len(user) > 6 and len(pwd) < 6:
                # 用户名大于6个字符,但是密码小于6个字符
                error_pwd = "这个有点短~~~"
            elif len(user) < 6 and len(pwd) > 6:
                # 用户名长度大于6,密码小于6
                error_name = "这个有点短!!!"
            else:
                error_name = "这个有点短!!!"
                error_pwd = "这个有点短~~~"
        # 第一次进来返回一个html登录页面
        return render(request,
                      "register.html",
                      {"error_name": error_name, "error_pwd": error_pwd})

     2,Django中的form提交数据:

    forms代码:

    from django import forms
    from app_form.models import User
    from django.core.exceptions import ValidationError
    from django.forms import widgets
    from django.core.validators import RegexValidator
    from app_form .models import User, Hobby
    import re
    
    
    # 验证校验输入框的信息(自定义校验)
    def check_name(value):
        if "雪" in value:  
            raise ValidationError("你这个不是来自于日 本")
        
        
    # 定义form类继承forms.Form(必须继承)
    class RegForm(forms.Form):
        # 指定类里边属性的类型字符串不超过32个字符
        user = forms.CharField(
            label="用户名",  # 在生成input标签的时候会显示用户名这几个字
            max_length=12,  # 用户名这个输入框的最大长度不超过32个字符
            min_length=6,  # 用户名这个输入框的最想长度不小于6个字符
            required=True,  # 表示这个输入框必须填的结果是False,也就是说可以为空
            initial="雪雪",  # initial的翻译是最初的,最开始的,也就是说输入框的第一次访问是指定的值"雪雪"
            disabled=False,  # disable翻译是禁用,表示这个输入框禁用的性质是False,表示可以输入值
            validators=[check_name],  # 翻译的意思是验证,也就是将用户输入的值传给check_name这个函数去校验
            error_messages={
                "min_length": "你这也太短了...,还不到6",
                "required": "不能为空"
            }
        )
        # 指定类里边的密码属性的字符串不差过32个字符
        pwd = forms.CharField(
            max_length=12,  # 密码的最大长度不超过12个字符
            min_length=6,  # 密码的最小长度不少于6个字符
            label="密码",  # 在生成input框的时候会说明 是这个输入框的的作用
            error_messages={
                "min_length": "你这也忒短了吧",
                "max_length": "你这太长了,都受不了了...",
                "required": "不能为空"
            }
        )
    
        gender = forms.ChoiceField(
            choices=((1, "男"), (2, "女"), (3, "不详")),  # 单选框只能选一个框
            widget=widgets.RadioSelect(),
            label="性别"
    
        )
    
        hobby = forms.ChoiceField(
            choices=((1, "足球"), (2, "篮球"), (3, "双色球")),
            widget=widgets.CheckboxSelectMultiple,
            label="爱好"
        )
    
        phone = forms.CharField(
            label="手机号",
            validators=[
                RegexValidator(r"^1[3-9]d{9}$", "手机号不正经")  # 模式:RegexValidator(正则匹配表达式, 错误信息)
            ]
        )
    
        # pwd = forms.CharField(
        #     label="密码",
        #     min_length=6,
        #     max_length=12,
        #     widget=widgets.PasswordInput()
        # )
    
        re_ped = forms.CharField(
            label="确认密码",
            min_length=6,
            max_length=12,
            widget=widgets.PasswordInput()
    
        )
        

    Html代码:

    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <title>高逼格的注册</title>
    </head>
    <body>
    <form action="" method="post" novalidate>
        {% csrf_token %}
    {#    {{ form_obj.as_p }}#}
    {#    <input type="submit">#}
        <p>
            {{ form_obj.user.label }}
            {{ form_obj.user }}
            <span style="color: red;">{{ form_obj.user.errors.0 }}</span>
            <div>{{ form_obj.user.errors.1 }}</div>
            <div>{{ form_obj.user.errors.2 }}</div>
        </p>
        <p>
            {{ form_obj.pwd.label }}
            {{ form_obj.pwd}}
            <span style="color: red">{{ form_obj.pwd.errors.0 }}</span>
        </p>
        <hr>
        <p>
    
            {{ form_obj.gender.lable }}
            {{ form_obj.gender }}
        </p>
        <p>
            {{ form_obj.hobby.label }}
            {{ form_obj.hobby }}
        </p>
        <p>
            {{ form_obj.phone.label }}
            {{ form_obj.phone }}
        </p>
        <p>
            {{ form_obj.pwd.label }}
            {{ form_obj.pwd }}
        </p>
        {{ form_obj.errors }}
        <input type="submit">
    </form>
    </body>
    </html>

    业务逻辑代码:

    def register(request):
        form_obj = RegForm()  # 实例化一个form中RegForm的对象就能拿到关于RegForm的属性和方法
        print("第一次实例化的对象:",form_obj,type(form_obj))
    
        if request.method == "POST":
            # 重新实例化一个RegForm的对象,可以拿到RegForm的所有的属性和方法
            form_obj = RegForm(request.POST)
            print("第二次实例化的对象:",form_obj,type(form_obj))
            print("错误信息:", form_obj.errors,type(form_obj.errors))
            for k, v in form_obj.errors.items():
                print(k, v)
            if form_obj.is_valid():
                # cleaned_data 是经过校验的数据
                print(form_obj.cleaned_data)  # 拿到的是一个{'user': '天王盖地虎,小米一米五', 'pwd': '123'}字典
                print(form_obj.cleaned_data["user"])
                print(form_obj.cleaned_data["pwd"])
                # 表示注册成功,可以享受提供的"服务"
                # 咱们先返回一个注册成功的页面表示注册成功进行的操作
                return HttpResponse("注册成功")
        # 一次访问是一个get请求,返回一个html页面
        return render(request, "register2.html", {"form_obj":form_obj})

     3钩子函数

    3.1>局部钩子函数代码:

        # 局部钩子函数,只是校验某一个字段的校验
    
        def clean_phone(self):
            # self指的是校验谁就是谁,clean_data是通过浏览器校验后拿出来的字典
            value = self.cleaned_data.get("phone")
            # 拿到用户输入的数据后进行正则匹配
            if re.match(r'1[3-9]d{9}', value):  # match(正则表达式, 要匹配的字符串)
                return value  # 当手机号匹配成功,是一个合法的手机号,就返回这个手机号
            # 当匹配不成功就抛异常
            raise ValidationError("手机号不正经")
    
        def clean_re_ped(self):
            # 获取用户输入的密码们
            pwd = self.cleaned_data.get("pwd")
            re_pwd = self.cleaned_data.get("re_pwd")
            # 判断两次输入的密码是否一致
            if pwd == re_pwd:
                # 当两次结果一致时,返回这个数据的字典
                return self.cleaned_data
            # 当pwd不等于re_pwd时抛一个异常返回给浏览器
            raise ValidationError("两次密码不一致")

    3.2>全局钩子函数代码:

      # 全局钩子函数
    
        def clean(self):
            # 全局钩子就是在forms里的所有字段都可以拿过来校验
            # 获取两次输入的密码来做校验
            pwd = self.cleaned_data.get("pwd")
            re_pwd = self.cleaned_data.get("re_pwd")
            # 判断两次结果是否正确
            if pwd == re_pwd:
                return self.cleaned_data
            # 增加错误信息
            self.add_error("re_pwd", "两次校验结果不一致")
            raise ValidationError("两次校验结果不一致")

    小结:form组件的主要功能:

    • 生成页面可用的标签
    • 对用户提交的数据进行校验
    • 保留上次输入的内容
  • 相关阅读:
    celery定时器
    基于Django的Rest Framework框架的视图组件
    Django的缓存机制
    Django中的跨域请求问题
    基于Django的Rest Framework框架的url控制器
    基于Django的Rest Framework框架的响应器
    基于Django的Rest Framework框架的分页组件
    基于Django的Rest Framework框架的解析器
    虚拟机下CentOS7开启SSH连接
    Vue中computed和watch的区别
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9899988.html
Copyright © 2011-2022 走看看