第五十五篇 Form表单和Django内置form表单

心得:坚持住,因为你正在走上坡路,走过去你就一定会有进步

一、Form介绍

我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。
Django form组件就实现了上面所述的功能,其实form组件的主要功能如下:

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

二、django的form的用法

1. 定义

from django import forms
from django.forms import widgets

class User(forms.Form):
    user = forms.CharField(label="用户名",min_length=6)
    pwd = forms.CharField(label="密码")

2.视图中使用

def register2(request):
    form = User()
    if request.method == "POST":
        form = User(request.POST)
        if form.is_valid():  #去校验数据是否合格
            print(form.cleaned_data['user']) ## cleaned_data  是经过校验的数据
            return HttpResponse("注册成功")
    return render(request,'register2.html',context={"form":form})

3.模板中使用
{{ form_obj.as_p }} ——》自动生成多个p标签 包含label input框
{{ form_obj.user }} ——》 生成某个字段的input框
{{ form_obj.username.id_for_label }} ——》 生成某个字段id
{{ form_obj.user.errors }} ——》 某个字段的所有错误信息
{{ form_obj.user.errors.0 }} ——》 某个字段的错误信息的第一个
{{ form_obj.errors }} ——》 所有字段的错误信息

三、普通方式form注册并校实现字符验功能

views.py

from django.shortcuts import render,HttpResponse

def register(request):
    error = ''
    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if len(user)<6:
            error = "你的用户名字符少于六位"
        else:
            return HttpResponse("注册成功")
    return render(request,'reg.html',context={"error":error})

reg.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>用户名
        <input type="text" name="user">
    </p>
    <p>密码
        <input type="password" name="pwd">
    </p>
    <p>{{ error }}</p>
    <button>注册</button>
</form>
</body>
</html>

在这里插入图片描述

四、使用django的form校验工具来实现注册功能

forms.py
在注册的app下新建文件forms.py来建form表单,可对字符内容进行限制

from django import forms

class User(forms.Form):
    user = forms.CharField(label="用户名",min_length=6)
    pwd = forms.CharField(label="密码")

views.py
导入表单后实例化使用

from django.shortcuts import render,HttpResponse
from app01.forms import User

def register2(request):
    form = User()   #实例化后使用
    if request.method == "POST":
        form = User(request.POST)
        if form.is_valid():  #去校验数据是否合格
            print(form.cleaned_data['user']) ## cleaned_data  是经过校验的数据
            return HttpResponse("注册成功")
    return render(request,'register2.html',context={"form":form}) #传递参数

reg.html
只需要将实例化的表单{{ form.as_p }}方法就会生成相应的表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button>注册</button>
</form>
</body>
</html>

• 前端页面是form类的对象生成的 -->生成HTML标签功能
• 当用户名和密码输入为空或输错之后 页面都会提示 -->用户提交校验功能
• 当用户输错之后 再次输入 上次的内容还保留在input框 -->保留上次输入内容
在这里插入图片描述

五、From中常用字段和插件

1. 初始值,input框里面的初始值。initial

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三"  # 设置默认值
    )
    pwd = forms.CharField(min_length=6, label="密码")

2. 重写错误信息。error_messages

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密码")

3. 密码格式。password
使用widget插件可以转换字段类型,需要导入插件

from django.forms import widgets

class RegForm(forms.Form):
    pwd = forms.CharField(
        label='密码',
        min_length=6,
        widget=widgets.PasswordInput()
    )

4. 单radio值为字符串

from django import forms
from django.forms import widgets

class User(forms.Form):
    user = forms.CharField(label="用户名",min_length=6)
    pwd = forms.CharField(label="密码")
    gender = forms.fields.ChoiceField(
        choices=((1, "男"), (2, "女"), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect()
    )

在这里插入图片描述
5. 单选Select

from django import forms
from django.forms import widgets

class User(forms.Form):
    hobby = forms.fields.ChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=3,
        widget=forms.widgets.Select()
    )

在这里插入图片描述
6.多选Select

from django.forms import widgets
class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )

在这里插入图片描述
7. 单选checkbox

class LoginForm(forms.Form):
    ...
    keep = forms.fields.ChoiceField(
        label="是否记住密码",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )

在这里插入图片描述
9. 多选checkbox

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )

在这里插入图片描述

六、校验

1. 内置校验
min_length 最小长度
max_length 最大长度
required 是否是必填的
2. 自定义校验器
正则校验
RegexValidator(正则,错误提示)

from django.core.validators import RegexValidator
class User(forms.Form):
    phone = forms.CharField(
        validators=[RegexValidator(r'1[3-9]\d{9}',"手机号不对")]
    )

函数校验

from django.core.exceptions import ValidationError

def check(val):
    if "tian" == val:
        raise ValidationError("你输入的用户是错误的")

class User(forms.Form):
    user = forms.CharField(label="用户名",validators=[check])

7、form表单注册功能实现
views.py

from django.shortcuts import render,HttpResponse,redirect
from app01.forms import User,Login

def reg_last(request):
    form_obj = Login()
    if request.method == 'POST':
        form_obj = Login(request.POST)
        if form_obj.is_valid():
            # 数据库操作
            return redirect('https://www.baidu.com')
    return render(request,'reg_last_self.html',context={"form_obj":form_obj})

forms.py

from django import forms
from django.forms import widgets
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError

class Login(forms.Form):

    username = forms.CharField(
        label="用户名"
    )
    password = forms.CharField(
        label='密码',
        min_length=6,
        widget=widgets.PasswordInput()
    )
    re_password = forms.CharField(
        label='确认密码',
        min_length=6,
        widget=widgets.PasswordInput()
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs.update({'class': 'form-control'})

    def clean(self):
        pwd = self.cleaned_data.get('password')
        re_pwd = self.cleaned_data.get('re_password')

        if pwd == re_pwd:
            return self.cleaned_data
        self.add_error('re_password', '两次密码不一致')
        raise ValidationError('两次密码不一致')

reg.html
form表单中novalidate当提交表单时不对表单数据(输入)进行验证:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <link rel="stylesheet" href="{% static 'reg.css' %}">
</head>
<body>
<div class="di"></div>
<div class="container">
    <div class="form">
        <form action="" method="post" novalidate>
            {% csrf_token %}
            <div class="user">
                <label for="{{ form_obj.username.id_for_label }}">用户名</label>
                {{ form_obj.username }}
            </div>
            <div class="pwd">
                <label for="{{ form_obj.password.id_for_label }}">密码</label>
                {{ form_obj.password }}
            </div>
            <span id="helpBlock2" class="help-block">{{ form_obj.password.errors.0 }}</span>

            <div class="re_pwd">
                <label for="{{ form_obj.re_password.id_for_label }}">确认密码</label>
                {{ form_obj.re_password }}
            </div>
            <span id="helpBlock2" class="help-block">{{ form_obj.re_password.errors.0 }}</span>

            <div class="button">
                <button>注册</button>
            </div>
        </form>
    </div>
</div>
</body>
</html>

reg.css

*{
margin:0;
padding:0;
}


.container{
    width:1226px;
    margin:75px auto;
}

.form{
width:500px;
margin:0 auto;

}

input{
width:210px;
height:20px;
padding:10px;
margin-top:20px;
font-size:40px;
}

label{
margin-right:30px;
font-size:25px;
}

button{
padding:15px;
}

.help-block{
margin-left:100px;
color:red;
font-size:15px;
}

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值