Django Form组件

Django Form组件,第1张

一、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模板



    
    Title


    
{% csrf_token %} {{ error.username.min }} {{ error.username.max }} {{ error.username.blank }}
{{ error.password.min }} {{ error.password.max }} {{ error.password.blank }}
{{ error.email.min }} {{ error.email.max }} {{ error.email.blank }}
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模板



    
    Title


{% csrf_token %} {{ form.as_p }} {# #} {# {{ form.username }}#} {# {{ form.username.errors.0 }}#} {# #}
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)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/916770.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存