Django Form组件

一、Django Form组件

1.1 Django Form 表单的主要功能

Django Form 表单的主要作用是对表单字段进行集中管理,主要功能介绍如下:
(1) 自动生成HTML表单元素,可以减少前端代码的编写。一方面字段类型生成默认标签,如CharField对应HTML中的 < input >标签;另一方面可以通过widget属性来渲染成HTML元素,如:forms.widgets.Select()对应的HTML中的< select > 标签
(2) 通过表单字段类型、属性的定义,自动产生校验表单数据的合法性的功能。例如:EmailField表示email字段。如果这个字段不是有效的电子邮箱格式,就会产生错误。
(3) 如果验证错误,将重新显示表单,已经输入的数据不会被重置或清空,用户界面友好。
(4) Django Form 表单可以用CSS和JavaScript资源进行渲染,使页面美观

Django Form 简单开发流程介绍

Django Form 开发主要有5个步骤:

  • 编写Django Form类
  • 建立URL与视图函数对应的关系
  • 视图函数中实例化Django Form类
  • 视图函数向模板文件发送Django Form实例化对象变量
  • 模板文件以一定的形式显示Django Form实例化对象中存储的字段信息

二、传统的表单数据处理

2.1传统的表单数据处理流程

1.获取数据
2.验证数据
3.如果数据有问题,则返回给前端并提示用户
4.如果数据没有问题,则继续往下执行

2.2传统的表单数据处理存在的问题

1.验证数据需要大量的判断语句
2.需要自己构建错误信息字典给前端显示
3.前端的所有表单标签都是自己写的,会导致两个问题.第一个问题就是前端的验证有可能写少了,第二个问题是开发效率不高

2.3传统的表单数据的代码

2.3.1模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="" method="post">
        {% csrf_token %}
        <label for="">用户名:</label>
        <input type="text" name="username" id="username">
        <span style="color: red">{{ error.username.min }}</span>
        <span style="color: red">{{ error.username.max }}</span>
        <span style="color: red">{{ error.username.blank }}</span>
        <br>
        <label for="">密码:</label>
        <input type="password" name="password" id="password">
        <span style="color: red">{{ error.password.min }}</span>
        <span style="color: red">{{ error.password.max }}</span>
        <span style="color: red">{{ error.password.blank }}</span>
        <br>
        <label for="">邮箱:</label>
        <input type="text" name="email" id="email">
        <span style="color: red">{{ error.email.min }}</span>
        <span style="color: red">{{ error.email.max }}</span>
        <span style="color: red">{{ error.email.blank }}</span>
        <br>
        <input type="submit">
    </form>
</body>
</html>

2.3.2视图函数

def test_form(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        email = request.POST.get('email')
        print(f'用户名:{username}密码:{password}邮箱:{email}')
        # 数据校验
        '''
            用户名长度太短
            密码符合要求
            邮箱为空
            errors = {
                'username':{
                    'min':'用户名太短',
                },
                'email':{
                    'blank':'用户名不能为空'
                },
            }
        '''
        error = {}
        if len(username) < 3:
            if error.get('username'):
                error.get('username')['min'] = '用户名太短'
            else:
                error['username'] = {'min':'用户名太短'}
        if len(username) > 6:
            if error.get('username'):
                error.get('username')['max'] = '用户名太长'
            else:
                error['username'] = {'max':'用户名太长'}
        if username.strip() == '':
            if error.get('username'):
                error.get('username')['blank'] = '用户名不能为空'
            else:
                error['username'] = {'blank':'用户名不能为空'}



        if len(password) < 3:
            if error.get('password'):
                error.get('password')['min'] = '密码太短'
            else:
                error['password'] = {'min':'密码太短'}
        if len(password) > 6:
            if error.get('password'):
                error.get('password')['max'] = '密码太长'
            else:
                error['password'] = {'max':'密码太长'}
        if password.strip() == '':
            if error.get('password'):
                error.get('password')['blank'] = '密码不能为空'
            else:
                error['password'] = {'blank':'密码不能为空'}


        if len(email) < 3:
            if error.get('email'):
                error.get('email')['min'] = '邮箱太短'
            else:
                error['email'] = {'min':'邮箱太短'}
        if len(email) > 6:
            if error.get('email'):
                error.get('email')['max'] = '邮箱太长'
            else:
                error['email'] = {'max':'邮箱太长'}
        if email.strip() == '':
            if error.get('email'):
                error.get('email')['blank'] = '邮箱不能为空'
            else:
                error['email'] = {'blank':'邮箱不能为空'}
        # (用户名长度最小为3,最大为6,不为空(不能全是空格))
        # (密码长度最小为3,最大为6,不为空(不能全是空格))
        # (邮箱长度最小为3,最大为6,不为空(不能全是空格))
        # 全部校验完成,如果所有字段都符合要求,就插入数据
        if not error:
            print('插入数据')
            return HttpResponse('展示页面')
        else:
            data = {
                'error':error
            }
            return render(request,'test_form.html',data)
        # 如果有字段不符合要求,则显示在前端页面
    return render(request,'test_form.html')

三、使用Django Form组件处理表单数据

3.1Django Form组件处理表单数据流程

1.在应用程序目录下新建一个forms.py文件
2.在该文件中定义我们的表单组件
3.在视图函数中,将所有数据都给自定义的表单组件
4.使用is_valid()方法进行数据校验,如果所有字段都符合要求,则返回True,否则返回False.如果返回的是False,则表单中的errors会带上所有的错误信息
5.在模板文件中我们可以使用一个模板变量来代替所有的表单标签

3.2Django Form组件表单数据代码

3.2.1 forms.py

# 1.导入forms模块
from django import forms
# 2.创建一个自定义的表单类,继承自forms.Form
class UserForm(forms.Form):
    # 3.定义表单的字段值
    '''
        min_length:最小长度限制
        max_length:最大长度限制
        required:必填项,默认为True
        label:指定label标签的内容
        error_messages:自定义错误信息
        widget:指定渲染的标签形式(可以指定标签的属性)
    '''
    username = forms.CharField(
        min_length=3,
        max_length=6,
        required=True,
        label='用户名',
        error_messages={
            'min_length':'用户名太短了',
            'max_length':'用户名太长了',
            'required':'用户名不能为空',
        },
        widget=forms.TextInput(attrs={'style':'color: red'})
    )
    password = forms.CharField(
        min_length=3,
        max_length=6,
        required=True,
        label='密码',
    )
    email = forms.EmailField(
        min_length=3,
        max_length=12,
        required=True,
        label='邮箱',
    )

3.2.2模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
{#    <label for="{{ form.username.id_for_label }}">用户名:</label>#}
{#    {{ form.username }}#}
{#    <span style="color: blue">{{ form.username.errors.0 }}</span>#}
{#    <input type="submit">#}
</form>
</body>
</html>

3.2.3视图函数

from .forms import *
def test_form_new(request):
    if request.method == 'POST':
        # 2.使用前端传上来的数据创建表单对象
        form = UserForm(request.POST)
        # 3.验证数据
        # is_valid():如果所有字段都符合要求,则返回True,否则返回False
        # 如果返回的是False,则表单中的errors会带上所有的错误信息
        if form.is_valid():
            # 4.获取数据,当数据验证成功后,数据会被存放在cleaned_data里
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            email = form.cleaned_data.get('email')
            print(f'用户名:{username}密码:{password}邮箱:{email}')
            print('插入数据')
            return HttpResponse('展示页面')
        else:
            data = {
                'form':form
            }
            return render(request,'test_form_new.html',data)
    # get请求不需要验证数据,直接返回空表单
    form = UserForm()
    data = {
        'form': form
    }
    return render(request, 'test_form_new.html', data)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值