django form组件

Django表单组件详解
本文深入探讨Django中的表单组件,涵盖HTML标签生成、数据校验、内容保留等功能,详细讲解form组件的使用步骤,包括类继承、对象创建、页面生成及数据效验,同时介绍了如何设置自定义效验规则、格式效验、显示样式,以及如何将数据保存到数据库。

Django 中的form组件实现了如下的功能
1、生成页面可用的HTML标签
2、对用户提交的数据进行校验
3、保留上次输入内容

使用form组件步骤
(1)、导入form组件:from django improt forms
(2)、编写类继承 form.Forms
(3)、创建对象
(4)、生成页面

代码:

#1、导入form组件
from django import forms

#2、编写类   继承forms.Form
class UserForm(forms.Form):
    """
    username、pwd 属性:对应页面中的label标签中显示的内容
    label 属性:用来修改label标签中显示的内容
    """
    username = forms.CharField(label='用户名')#生成用户名输入框
    pwd = forms.CharField(label='密码')#生成密码输入框

def register_form1(request):
    #3、创建对象
    user_form = UserForm()
    return render(request,'app01/register_form.html',{'user_form':user_form})
    #{'user_form':user_form} 给register_form.html传输数据



#4生成页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form组件</title>
</head>
<body>
{#    生成表单输入框   #}
{{ user_form.as_p }}
{# {{ user_form.as_ul }} #}
{#{{ user_form.as_table }}#}
</body>
</html>

效验输入信息

#2、编写类   继承forms.Form
class UserForm(forms.Form):
    """
    username、pwd 属性:对应页面中的label标签中显示的内容
    label 属性:用来修改label标签中显示的内容
    """
    # 生成用户名输入框
    username = forms.CharField(
        label='用户名',
        required=True,  # 输入不能为空
        min_length=2,  # 长度至少2位
        error_messages={   #修改错误信息
            'required': '不能为空',
            'min_length': '至少2位'
        }
    )
    # 生成密码输入框
    pwd = forms.CharField(
        label='密码',
        required=True,
        min_length=6,
        error_messages={
            'required':'不能为空',
            'min_length':'至少6位'
        }
    )

def register_form1(request):
    #3、创建对象
    user_form = UserForm()
    # 判断提交类型
    if request.method == 'POST':
        #将表单上验证的消息封装成user_form中进行校验
        user_form = UserForm(request.POST)
    return render(request,'app01/register_form.html',{'user_form':user_form})
    #{'user_form':user_form} 给register_form.html传输数据

优化页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form组件</title>
</head>
<body>
{#novalidate :去掉表单效验,因为自动生成的标签自动添加了 required 属性#}
    <form action="" method="post" novalidate>
        {% csrf_token %}
        {% comment %}
            1、user_form 是UserForm类的对象
            2、user_form.username :user_form 调用username 属性
            3、user_form.username.lable : username 也是一个对象,username.label调用feild对象中的label 属性
                {{ user_form.username.label }} :{{ user_form.username }}
            4、user_form.username.label_tag :加上_tag就是自动添加:而不用手动来添加:
            5、user_form.username.errors.0
                注意 : 一定要加.0 因为user_form.username.errors 是一个列表
                若是不加的话 就会自动生成无序列表展示在页面上
        {% endcomment %}
        {{ user_form.username.label_tag }} {{ user_form.username }} <span style="color: red">{{ user_form.username.errors.0 }}</span><br/>
        {{ user_form.pwd.label_tag }} {{ user_form.pwd }} <span style="color: red">{{ user_form.pwd.errors.0 }}</span><br/>
        <input type="submit" value="注册">
    </form>
</body>
</html>

保存数据库
models.py

#创建User模型
class User(models.Model):
    username = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    def __str__(self):
        return 'username : {}'.format(self.username)

生成迁移文件表格 链接地址
makemigrations
migrate

视图函数中

# 导入models
from app01 import models

def register_form1(request):
    #3、创建对象
    user_form = UserForm()
    # 判断提交类型
    if request.method == 'POST':
        #将表单上验证的消息封装成user_form中进行校验
        user_form = UserForm(request.POST)
        #判断输入的内容是否正确
        if user_form.is_valid():
            #user_form.cleaned_data获取表单提交的信息返回为字典的形式.
            user_data = user_form.cleaned_data
            #注意 :  
                # 一定要有判断若是没有判断直接写user_form.cleaned_data这条语句则会直接报错 
            #数据库增加用户名和密码
            models.User.objects.create(
                username=user_data.get('username'),#get通过字典的键来获取值
                pwd=user_data.get('pwd')
            )
            return HttpResponse('success')#若为正确页面显示success
    return render(request,'app01/register_form.html',{'user_form':user_form})
    #{'user_form':user_form} 给register_form.html传输数据

自定义效验规则过滤内容
1、导入ValidationError类
2、覆写 clean 方法

# 1、导入ValidationError类
from django.forms import ValidationError
class UserForm(forms.Form):
    """
    username、pwd 属性:对应页面中的label标签中显示的内容
    label 属性:用来修改label标签中显示的内容
    """
    # 生成用户名输入框
    username = forms.CharField(
        label='用户名',
        required=True,  # 输入不能为空
        min_length=2,  # 长度至少2位
        error_messages={   #修改错误信息
            'required': '不能为空',
            'min_length': '至少2位'
        }
    )
    # 生成密码输入框
    pwd = forms.CharField(
        label='密码',
        required=True,
        min_length=6,
        error_messages={
            'required':'不能为空',
            'min_length':'至少6位'
        }
    )
    #2、覆写clean方法
    def clean(self):
        user_data = self.cleaned_data #获取提交的所有数据
        username = user_data.get('username')  #获取username中的值返回的是字符串
        if username:
	        if username.find('sb') != -1:
	            #在字符串中查找sb
	            #若是找不到就返回-1
	            # != -1 就是找到sb了
	            error = ValidationError('名称需要有内涵') #创建异常对象
	            self.add_error('username',error) #在username中添加异常对象
	            raise error #抛出异常
        return self.cleaned_data

自定义规则效验格式
例:手机号码必须为11位
1、导入正则
2、使用关键字validatord
代码:

#导入正则
from django.core.validators import RegexValidator
class UserForm(forms.Form):
    #创建手机号输入框
    phone = forms.CharField(
        label='手机号',
        required=True,
        #使用关键字validators验证器
        validators=[
            RegexValidator(r'^[0-9]+$','手机号为数字'),
            RegexValidator(r'^1[3-9][0-9]{9}$','手机号格式错误')
        ],
        error_messages={
            'required':'必填项',
        }
    )

设置显示样式
设置密码框和CSS样式
1、导入widgets模块
2、使用关键字widgets

#导入widgets
from django.forms import widgets
class UserForm(forms.Form):
    """
    username、pwd 属性:对应页面中的label标签中显示的内容
    label 属性:用来修改label标签中显示的内容
    """
    # 生成用户名输入框
    username = forms.CharField(
        label='用户名',
        required=True,  # 输入不能为空
        min_length=2,  # 长度至少2位
        error_messages={   #修改错误信息
            'required': '不能为空',
            'min_length': '至少2位'
        },
        widget=widgets.TextInput(attrs={'class':'name'})
    )
    # 生成密码输入框
    pwd = forms.CharField(
        label='密码',
        required=True,
        min_length=6,
        error_messages={
            'required':'不能为空',
            'min_length':'至少6位'
        },
        widget=widgets.PasswordInput(render_value=True)
        #render_value设置回显
    )
    #创建手机号输入框
    phone = forms.CharField(
        label='手机号',
        required=True,
        #使用关键字validators验证器
        validators=[
            RegexValidator(r'^[0-9]+$','手机号为数字'),
            RegexValidator(r'^1[3-9][0-9]{9}$','手机号格式错误')
        ],
        error_messages={
            'required':'必填项',
        }
    )
    #2、覆写clean方法
    def clean(self):
        user_data = self.cleaned_data #获取提交的所有数据
        username = user_data.get('username')  #获取username中的值返回的是字符串
        if username.find('sb') != -1:
            #在字符串中查找sb
            #若是找不到就返回-1
            # != -1 就是找到sb了
            error = ValidationError('名称需要有内涵') #创建异常对象
            self.add_error('username',error) #在username中添加异常对象
            raise error #抛出异常
        return self.cleaned_data

html中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form组件</title>
    <style type="text/css">
        .name{
            color: blue;
        }
    </style>
</head>
<body>
{#novalidate :去掉表单效验,因为自动生成的标签自动添加了 required 属性#}
    <form action="" method="post" novalidate>
        {% csrf_token %}
        {% comment %}
            1、user_form 是UserForm类的对象
            2、user_form.username :user_form 调用username 属性
            3、user_form.username.lable : username 也是一个对象,username.label调用feild对象中的label 属性
                {{ user_form.username.label }} :{{ user_form.username }}
            4、user_form.username.label_tag :加上_tag就是自动添加:而不用手动来添加:
            5、user_form.username.errors.0
                注意 : 一定要加.0 因为user_form.username.errors 是一个列表
                若是不加的话 就会自动生成无序列表展示在页面上
        {% endcomment %}
        {{ user_form.username.label_tag }} {{ user_form.username }} <span style="color: red">{{ user_form.username.errors.0 }}</span><br/>
        {{ user_form.pwd.label_tag }} {{ user_form.pwd }} <span style="color: red">{{ user_form.pwd.errors.0 }}</span><br/>
        {{ user_form.phone.label_tag }} {{ user_form.phone }} <span style="color: red">{{ user_form.phone.errors.0 }}</span><br/>
        <input type="submit" value="注册">
    </form>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值