Django——forms组件

本文详细介绍了如何在Django中使用forms组件创建表单,包括定义表单类、在HTML中渲染以及数据验证的过程,展示了如何处理用户输入并确保数据的有效性。
摘要由CSDN通过智能技术生成

Django——forms组件

Django的forms组件是Django框架中用于处理表单数据的一个重要部分,它极大地简化了表单的创建、验证和渲染过程。以下是对Django forms组件的详细介绍:

一、forms组件的主要功能

  1. 数据验证:forms组件提供了丰富的字段类型和验证规则,可以轻松地验证用户输入的数据是否符合要求。
  2. 自动生成错误信息:当验证失败时,forms组件会自动生成错误信息,并可以在前端页面上展示给用户。
  3. 打包用户提交的正确信息:通过forms组件,可以方便地获取用户提交的正确信息,并将其打包成字典或其他数据结构,以便后续处理。
  4. 保留上次输入的内容:在表单验证失败时,forms组件可以保留用户上次输入的内容,以便用户重新填写时不需要从头开始。
  5. 自动创建input标签并设置样式:forms组件可以自动生成HTML表单的input标签,并允许开发人员设置样式,从而减少了前端开发的工作量。

二、forms组件的基本使用

  1. 导入forms组件
    在Django项目中,首先需要从django.forms模块中导入Form类或其他表单字段类。

  2. 定义表单类
    通过继承Form类来定义自己的表单类,并在类中定义需要验证的字段。每个字段都是一个表单字段对象,它们定义了表单中的输入字段类型以及验证规则等。

    from django import forms  
     
    class MyForm(forms.Form):  
        name = forms.CharField(label='用户名', max_length=100)  
        email = forms.EmailField(label='邮箱')
    
  3. 实例化表单对象
    在视图中,通过实例化表单类来创建一个表单对象。这个对象可以用于渲染表单到HTML页面上,也可以用于接收用户提交的数据并进行验证。

    from django.shortcuts import render  
     
    def my_view(request):  
        if request.method == 'POST':  
            form = MyForm(request.POST)  
            if form.is_valid():  
                # 处理表单数据  
                pass  
        else:  
            form = MyForm()  
        return render(request, 'my_template.html', {'form': form})
    
  4. 渲染表单到HTML页面
    在HTML模板中,可以使用Django模板语言来渲染表单对象。forms组件提供了多种渲染方式,包括自动渲染、表格渲染、段落渲染、列表渲染和自定义渲染等。

    <form method="post">  
        {% csrf_token %}  
        {{ form.as_p }}  
        <input type="submit" value="提交">  
    </form>
    

    或者自定义渲染方式:

    <form method="post">  
        {% csrf_token %}  
        <p>{{ form.name.label }}: {{ form.name }}</p>  
        <p>{{ form.email.label }}: {{ form.email }}</p>  
        <input type="submit" value="提交">  
    </form>
    
  5. 验证表单数据
    在视图中,通过调用表单对象的is_valid()方法来验证用户提交的数据。如果验证通过,可以通过cleaned_data属性获取经过验证的数据;如果验证失败,可以通过errors属性获取错误信息。

三、forms组件的进阶使用

  1. 自定义验证规则
    除了使用forms组件内置的验证规则外,还可以通过定义表单类的clean_<字段名>()方法来为特定字段添加自定义验证规则,或者通过定义clean()方法来为整个表单添加全局验证规则。
  2. 表单字段的widget属性
    表单字段的widget属性允许开发人员为字段指定HTML插件(如输入框、密码框、选择框等),并可以设置插件的属性(如类名、样式等)。
  3. 表单的初始化
    在实例化表单对象时,可以通过传递initial参数来设置表单的初始值。这些初始值将在表单渲染到HTML页面上时显示为用户已经输入的内容。
  4. 表单的局部钩子和全局钩子
    局部钩子用于对表单中的某个字段进行验证,而全局钩子则用于对整个表单进行验证。通过定义这些方法,可以实现更复杂的验证逻辑。

综上所述,Django的forms组件是一个功能强大的表单处理工具,它简化了表单的创建、验证和渲染过程,并提供了丰富的字段类型和验证规则。通过合理使用forms组件,可以大大提高Web应用程序的开发效率和用户体验。

forms组件:通过后端在Django中定义forms类,可以在 html 中动态的生成一个表单;检验用户提交的数据。

在应用中创建一个名为 :forms 的py文件

# 导入 forms 组件
from  django import forms

# 自定义 forms 表单类 , 表单类必须继承 forms.Form
# 在 Django 的 forms 组件中没有提供按钮标签
class MyForm(forms.Form):
    # 定义表单标签属性
    # 在定义之后 , 渲染到 html 中是一个 label 和 input 标签
    username = forms.CharField(label='用户名')
    password = forms.CharField(label='密码')
def showforms(request):
    # 渲染表单:生成一个表单类对象 , 提交到 html 中
    if request.method == 'GET':
        # 生成一个空白的表单类对象
        forms = MyForm()
    else:
        # 但请求为 post 请求的时候 , 说明用户提交数据
        # 将数据传递该 form 组件(表单类接收的数据要是字典类型的数据)
        forms = MyForm(request.POST)
        res = '数据已提交'
    return render(request , 'index.html' , locals())
<body>
<form method="post">
    {% csrf_token %}
    {{ forms }}
    <input type="submit" value="注册">
</form>
<span>{{ res }}</span>
</body>

在模板中渲染自定义表单类

<form method="post">
    {% csrf_token %}
    <p>使用表格的样式渲染</p>
    {{ forms.as_table }}
    <p>使用段落的样式渲染</p>
    {{ forms.as_p }}
    <p>使用列表的样式渲染</p>
    {{ forms.as_ul }}
    <input type="submit" value="注册">
</form>

forms 组件提供的组件设置

# 自定义 forms 表单类 , 表单类必须继承 forms.Form
# 在 Django 的 forms 组件中没有提供按钮标签
class MyForm(forms.Form):
    # 定义表单标签属性
    # 在定义之后 , 渲染到 html 中是一个 label 和 input 标签
    username = forms.CharField(label='用户名')
    password = forms.CharField(label='密码',
                               # 设置 password 文本框
                               widget = forms.PasswordInput(),
                               )

    # 邮箱
    email = forms.EmailField(label='邮箱')
    # 日期
    day = forms.DateField(label='日期',
                          # 设置日历选项
                          widget=forms.TextInput(attrs={'type':'date'}))
    # 选项框
    # choices 设置选项内容 , 内容要以元组类型设置
    gender = forms.ChoiceField(choices=((1,'女'),(2,'男'),(3,'未知')) , label='性别',
                               # 设置选项框类型: 单选 RadioSelect
                               widget=forms.RadioSelect(),
                               # 设置默认选项
                               initial = 3)
    work = forms.ChoiceField(choices=((1,'学生'),(2,'搬砖'),(3,'退休')) , label='职业',
                               # 设置选项框类型: 单选 Select
                               widget=forms.Select(),
                               # 设置默认选项
                               initial = 3)
    hobby = forms.ChoiceField(choices=((1,'爬山'),(2,'唱歌'),(3,'跳舞'),
                                       (4,'rap'),(5,'跆拳道'),(6,'篮球')) , label='爱好',
                               # 设置选项框类型: 多选 CheckboxSelectMultiple
                               widget=forms.CheckboxSelectMultiple(),
                               # 设置默认选项
                               initial = [2,6])
    subject = forms.MultipleChoiceField(choices=((1,'物理'),(2,'化学'),(3,'生物'),
                                       (4,'地理'),(5,'历史'),(6,'政治')) , label='科目',
                               # 设置选项框类型: 多选 CheckboxSelectMultiple
                               widget=forms.CheckboxSelectMultiple(),
                               # 设置默认选项
                               initial = [1])

    xy = forms.CharField(label='阿宸要你写代码的协议',widget=forms.CheckboxInput())

forms 组件验证数据

class RegisterView(View):
     def get(self , request):
         return render(request , 'register.html')

     def post(self , request):
         # 数据给 forms 组件进行数据校验
         register_form = RegisterForm(request.POST)

         # 判断数据是否合法
         # is_valid 判断表单类中获取的数据校验是否合法,合法返回 True
         # register_form.errors 存放的就是数据的错误信息
         if register_form.is_valid():
             return HttpResponse('注册成功')
         else:
             return render(request , 'register.html' , locals())
# 数据验证
class RegisterForm(forms.Form):
    username = forms.CharField(max_length=10 , min_length=3,
                               # 设置错误信息字典
                               error_messages={
                                   'max_length' : '用户名长度超出',
                                   'min_length' : '用户名长度不足',
                                   'required' : '不允许为空'
                               })
    password = forms.CharField(max_length=15 , min_length=6,
                               error_messages={
                                   'max_length': '密码长度超出',
                                   'min_length': '密码长度不足',
                                   'required': '不允许为空'
                               })
    password2 = forms.CharField(max_length=15 , min_length=6,
                                error_messages={
                                    'max_length': '密码长度超出',
                                    'min_length': '密码长度不足',
                                    'required': '不允许为空'
                                })

    # 验证数据使用钩子函数 , 钩子:自定义的校验规则
    # 局部钩子:给一个字段数据校验
    # 定义局部钩子的函数名称:clean_属性名
    def clean_username(self):
        # 勾取数据:获取到对应的属性数据
        data = self.cleaned_data.get('username')
        # 进行数据检验
        if not re.match(r'^[a-zA-Z0-9]{3,10}$' , data):
            # 添加异常信息
            # self.add_error(属性 , 错误信息)
            self.add_error('username' , '用户名不合法')
        # 把勾取到的数据返回回去
        return data

    # 全局钩子:过多个字段校验
    def clean(self):
        pwd1 = self.cleaned_data.get('password')
        pwd2 = self.cleaned_data.get('password2')
        if pwd1 != pwd2:
            self.add_error('password2', '两次密码不一致')

        return self.cleaned_data
<body>
{#  novalidate 关闭浏览器自动渲染 form 组件的错误信息 #}
<form method="post" novalidate>
    {% csrf_token %}
    <p>用户名:<input type="text" name="username"></p>
    <span style="color:red;">{{ register_form.username.errors.0 }}</span>
    <p>密码:<input type="password" name="password"></p>
    <span style="color:red;">{{ register_form.password.errors.0 }}</span>
    <p>确认密码:<input type="password" name="password2"></p>
    <span style="color:red;">{{ register_form.password2.errors.0 }}</span>
    <input type="submit" value="注册">
</form>
</body>
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值