django 11 from组件

form组件

复制代码
# 1.form组件支持提前设置各种检验规则,之后自动校验
# 2.form组件可以支持直接渲染用户数据的各种标签
# 3.form组件支持针对不同的校验失败展示不同的提示
# 4.form组件的使用
- 1. 创建form类型
  from django import forms

  class MyForm(forms.Form):
      name = forms.CharField(max_length=8, min_length=3)  # 用户名最长八个字符 最短三个字符
      age = forms.IntegerField(max_value=150, min_value=0)  # 年龄最小0岁 最大150岁
      email = forms.EmailField()  # 邮箱必须符合邮箱格式(至少有个@符号)

- 2. 数据校验功能
    # 1.传递待校验的数据
    form_obj = views.MyForm({'name':'jason','age':18,'email':123})
    # 2.判断所有的数据是否符合校验
    form_obj.is_valid()
    # 3.获取符合校验规则的数据
    form_obj.cleaned_data
    {'name': 'jason', 'age': 18}
    # 4.查阅不符合校验规则的数据及错误原因
    form_obj.errors
    {'email': ['Enter a valid email address.']}

"""
1.form类中编写的字段默认都是必填的,少传则肯定通不过校验 is_valid
2.校验如果多传了一些字段 则不参与校验 全程忽略
"""
- 3. 渲染标签功能
    # 1.方式1(封装程度高 扩展性差)
    {{ form_obj.as_p }}
    {{ form_obj.as_table }}
    {{ form_obj.as_ul }}

    # 2.方式2(封装程度低 扩展性好 编写困难)
    {{ form_obj.name.lable }}
    {{ form_obj.name }}

    # 3.方式3(推荐使用)
    {% for form in form_obj %}
    <p>{{ form.label }}{{ form }}</p>
    {% endfor %}

        """
        类中以外的所有标签都不会自动渲染 需要自己编写
        """

- 4. 展示提示信息
 -1.form表单如何取消浏览器自动添加的数据校验功能
前端:
    <form action="" method="post" novalidate>
    {% for form in form_obj %}
        <p>
            {{ form.label }}{{ form }}
            <span style="color: red;">
                {{ form.errors.0 }}
            </span>
        </p>
    {% endfor %}
    <input type="submit" value="提交">

后端:
    def func(request):
        form_obj = MyForm()
        if request.method == 'POST':
            form_obj = MyForm(request.POST)
            if form_obj.is_valid():
                print(form_obj.cleaned_data)
        return render(request,'func.html',locals())
复制代码

forms组件渲染标签

复制代码
#  1.form组件渲染标签的三种方式
后端:
from django import forms

class Myforms(forms.Form):
    username = forms.CharField(min_length=3,max_length=8,)
    age = forms.IntegerField(min_value=1,max_value=150)
    email = forms.EmailField()

def ab_from_func(request):
    form_obj = Myforms()
    return render(request,'Page.html',locals())

方式一:
<p>forms组件渲染标签的方式1(封装程度过高 扩展性差 主要用于本地测试):</p>   
        {{ form_obj.as_p }}
        {{ form_obj.as_ul }}
        {{ form_obj.as_table }}

方式二:
<p>forms组件渲染标签的方式2(封装程度过低 扩展性高 编写麻烦)</p>
        {{ form_obj.username.label }}
        {{ form_obj.username }}
        {{ form_obj.age.label }}
        {{ form_obj.age }}
        {{ form_obj.email.label }}
        {{ form_obj.email }}
 方式三:   
<p>forms组件渲染标签的方式3(封装程度较高 扩展性高 编写简单 推荐使用)</p>
        {% for form in form_obj %}
            <p>
                {{ form.label }}
                {{ form }}
            </p>
        {% endfor %}

"""
    form组件只负责渲染获取用户数据的标签,所以对于标签和按钮都需要自己手动编写
    在使用form组件时,可以直接取消前端帮我们校验
          <form action="" novalidate>
"""
复制代码

forms组件展示信息

复制代码
复制代码
# 1.后端不同请求返回的forms对象一定要是相同的变量名
后端:
def ab_forms_func(request):
    # 产生一个空对象
    form_obj = MyForm()
    if request.method == 'POST':
        form_obj = MyForm(request.POST)  # request.POST可以看成是一个字典,直接传给forms类校验,字典中无论有多少键值对都没关系 之在乎类中编写的
        if form_obj.is_valid():  # 校验数据是否合法
            print(form_obj.cleaned_data)
        else:
            print(form_obj.errors)
    # 将该对象传递给html文件
    return render(request, 'formsPage.html', locals())

前端:
    {% for form in form_obj %}
            <p>
                {{ form.label }}
                {{ form }}
                <span>{{ form.errors.0 }}</span>
            </p>
    {% endfor %}


# 2.针对错误信息的提示可以修改成各国语言

# 方式1:自定义内容
    """给字段对象添加errors_messages参数"""
    username = forms.CharField(min_length=3, max_length=8, label='用户名',
            error_messages={
                  'min_length': '用户名最少三个字符',
                  'max_length': '用户名最多八个字符',
                  'required': '用户名不能为空'
            })
# 方式2:修改系统语言环境
    from django.conf import global_settings  django内部真正的配置文件
复制代码
复制代码

forms组件校验补充

复制代码
# forms组件针对字段数据的校验 提供了三种类型的校验方式(可以一起使用)
    第一种类型:直接填写参数           max_length
    第二种类型:使用正则表达式              validators    
     第三种类型:钩子函数                  编写代码自定义校验规则

# 1.局部钩子:检验单个字段
代码分析:
    def clean_name(self):
        name = self.cleaned_data.get('name')
        res = models.User.objects.filter(name=name).first()
        if res:
            return self.add_error('name','用户名已存在')
        return name


# 2.全局钩子:检验多个字段
代码分析:
    def clean(self):
        pwd = self.cleaned_data.get('pwd')
        confirm_pwd = self.cleaned_data.get('confirm_pwd')
        if not pwd == confirm_pwd:
            return self.add_error('confirm_pwd','两次密码不一致')
        return self.cleaned_data
复制代码

forms组件参数补充

复制代码
# 5. 一些重要的字段参数
   max_length、min_length
   max_value、min_value
   label                # 字段注释
   error_messages       # 错误提示
   required             # 否为空
   widget               # 标签类型、标签属性
   initial              # 默认值
   validators           # 正则校验
   required             # 是否必填
   widget               # 控制标签的各项属性
   """
   widget=forms.widgets.PasswordInput(attrs={'class': 'form-control', 'username': 'jason'})
   """
复制代码

forms组件源码剖析

在:form_obj.is_valid()内

modelform组件

复制代码
# 1.modelform是form的优化版本,使用更简单,但是功能更强。
class MyModelForm(forms.ModelForm):
class Meta:
    model = models.User
    fields = '__all__'
def clean_name(self):
    name = self.cleaned_data.get('name')
    res = models.User.objects.filter(name=name).first()
    if res:
        self.add_error('name','用户名已存在')
    return name
复制代码
posted @   橘子菌菌n  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示