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组件的主要功能:

  • 生成页面可用的标签
  • 对用户提交的数据进行校验
  • 保留上次输入的内容

原文地址:https://www.cnblogs.com/ljc-0923/p/9899988.html

时间: 2024-11-05 17:45:55

Django中的form表单的相关文章

Django中的Form表单验证

回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错误信息的字典,并会遍历类的所有属性(对应前端待验证的输入域),调用各自的验证方法,将错误信息(两类,必要与否以及格式正确与否)存入字典,并得出最终的验证结果.在使用时,需要定义继承自Form基类不同的Form类,以对应有着不同输入域的Form表单.在拿到前端给的字典前,要先初始化自定义From类,直

Django 中的Form表单认证

一.Form表单 ? 1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签 ? 1.2 创建表单类Form 1. 创建的类必须继承类:forms.Form 2. 字段名必须与前端表单中的名称一致(完全一样) 3. Field类是所有其他类的基类 #!/usr/bin/env python # -*- coding:utf-8 -*- import re from django import forms from d

django中的 form 表单操作

1. 定义   from django import forms # 定义form   class RegForm(fo rms.Form):    user = forms.CharField(label='用户名')    pwd = forms.CharField(label='密码') 2. 使用   视图中    form_obj = RegForm()    return render(request, 'register2.html', {"form_obj": form

# Django admin、form表单的应用记录

目录 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 form组件使用 1. form的作用 2. form组件生成HTMKL代码 3. form组件校验数据有效性 3. form组件如何给html标签设置默认值 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 1. 创建超级用户 python manage.py createsuperuser username: wph password: 1231

HTML中的form表单有一个关键属性 enctype

HTML中的form表单有一个关键属性 enctype=application/x-www-form-urlencoded 或multipart/form-data. 1.enctype="application/x-www-form-urlencoded"是默认的编码方式,当以这种方式提交数据时,HTTP报文中的内容是: Html代码   <span style="font-size: small;">POST /post_test.php HTTP/

Django基础之Form表单验证

Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from django.forms import widgets from Mybbs.models import * import re class UserForm(Form): username = fields.CharField( required=True, error_messages={'re

Javascript中的Form表单知识点总结

在HTML中,表单是由form元素来表示的,但是在javascript中,表单则由HTMLFormElement类型,此元素继承了HTMLElement,因此与其他HTML元素具有相同的默认属性:HTMLFormElement有自己以下属性和方法: acceptCharset: 服务器能够处理的字符集:等价于HTML中的accept-charset特性: action:  接收请求的URL,等价于HTML中的action elements: 表单中所有控件的集合. enctype: 请求的编码类

第83天:jQuery中操作form表单

操作form表单 1. 属性操作 设置属性: // 第一个参数表示:要设置的属性名称 // 第二个参数表示:该属性名称对应的值 $(selector).attr("title", "传智播客"); 获取属性: // 参数为:要获取的属性的名称,改操作会返回指定属性对应的值 $(selector).attr("title"); 此时,返回指定属性的值 移除属性: // 参数为:要移除的属性的名称 $(selector).removeAttr(&qu

[oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库

1 form表单如何生成多选框(包含了多选框可选择内容) - Form设置班级输入框为 select多选 - 多选 class TeacherForm(Form): name = fields.CharField(max_length=16, widget=widgets.TextInput(attrs={'class': 'form-control'}) ) cls = fields.MultipleChoiceField( choices=models.Classes.objects.val