Django——forms组件

简介: Django——forms组件

Django——forms组件

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>


相关文章
|
1天前
|
存储 数据安全/隐私保护 网络架构
DRF Django REST framework 之 认证组件(五)
DRF Django REST framework 之 认证组件(五)
|
1月前
|
JSON 数据库 数据格式
Django之Form组件
Django之Form组件
|
1月前
|
数据库 开发者 UED
如何使用Django的Form组件
如何使用Django的Form组件
37 0
|
10月前
|
前端开发 中间件 数据安全/隐私保护
【Django】创建用户,中间件,表单组件
【Django】创建用户,中间件,表单组件
52 0
|
6月前
|
Python
如何使用 Django Forms 创建表单?
如何使用 Django Forms 创建表单?
48 0
如何使用 Django Forms 创建表单?
|
JSON JavaScript 前端开发
使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)
所谓的无限极分类是啥?其实简单点说就是一个人类可以繁衍出多个后代,然后一个后代又可以分另外多个后代这样无限繁衍下去(可以想象[神奇动物在哪里2](https://movie.douban.com/subject/26147417/)里面莱斯特兰奇的家族族谱),就好象linux系统你可以新建一个文件夹,然后在这个文件夹里又可以建一些个文件夹,在文件夹底下还可以建一些文件夹一样,随后使用tree命令就可以查看文件夹目录层级。
使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)
|
数据安全/隐私保护 Python
Python全栈 Web(Django框架、forms对象、cookie、session)
Flask、Python、Django、框架、服务器、客户端、浏览器、交互、WEB、Python前端、CSS、JAVA、HTML、H5、PHP、JavaScript、JQuery、分布式开发、项目、flask项目、项目实战、django框架、Python项目、Python的Flask框架、Pytho.
1974 0
|
Python
Django的Content-Type组件
一、需求 现在我们有这样一个需求~我们的商城里有很多的商品,节日要来了,我们要搞活动。那么我们就要设计优惠券,优惠券都有什么类型呢,满减的、折扣的、立减的。
1180 0
|
Web App开发 前端开发 JavaScript
Django中母版、组件、inclusion_tag的使用
母版页用于处理html页面相同部分内容,避免出现冗余代码 一、母版的使用: 使用母版情况1:母板中定义页面专用的CSS块和JS块,方便子页面替换。 使用母版情况2:多个页面有很多共同的代码段时可以将相同的代码段提取出来。
1091 0
|
前端开发 JavaScript 数据库
Django中的Form组件
一、form组件的主要功能: 生成页面的HTML标签及样式 对用户提交的数据进行校验 自动生成错误信息 保留上次输入信息 二、使用form组件实现注册功能 1、在Django项目下创建一个文件夹,在文件夹中创建一个朋友文件,名字随便起,之后在py文...
1348 0