• form 组件


    一 form组件

      服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息

    form组件的2大功能:
           1 验证(显示错误信息)
           2 保留用户上次输入的信息
                      -- 可以生成html标签

    二 form组件的第一层过滤验证

    1 html 文件 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <h3>添加员工</h3>
    
    <form action="" method="post">
        {% csrf_token %}
        <p>姓名<input type="text" name="name"></p>
        <p>年龄<input type="text" name="age"></p>
        <p>薪水<input type="text" name="salary"></p>
        <input type="submit" value="submit">
    </form>
    <hr>
    
    </body>
    </html>

    2 模型类

    class Emp(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()
        salary=models.DecimalField(max_digits=8,decimal_places=2)

    3 form组件类(必须继承forms.Form)

    from django import forms #导入forms组件
    
    
    class EmpForm(forms.Form): #继承forms组件
        name=forms.CharField(min_length=5)
        age=forms.IntegerField()
        salary=forms.IntegerField()

    4 view视图

    def addEmp(request):
        if request.method=='GET':
            return render(request,'add.html')
        else:
            eform=EmpForm(request.POST)
            if eform.is_valid():
                print(eform.cleaned_data)
                print(eform.errors)
                models.Emp.objects.create(**eform.cleaned_data)
                return HttpResponse('添加成功!')
            else:
                print(eform.cleaned_data)
                print(eform.errors)
                return HttpResponse('失败!')

    三 form组件渲染模板的三种方式

    1 方式一 :form_emp.as_p  自动将每一个校验的字段创建为input标签(不推荐)

    <h3>方式一</h3>form_empty.as_p每一个字段创建一个input标签
    <form action="">
        {{ form_emp.as_p }}
    
        <input type="submit" value="submit">
    </form>

    2 方式二:手动使用字段创建标签

    <h3>渲染方式2 </h3>
    1 novalidate :跳过浏览器校验
    
    <form action="" method="post" novalidate>
        {% csrf_token %}
        <div>
            <label for="">姓名</label>
            {{ form_emp.name }} <span>{{ form.name.errors.0 }}</span>
        </div>
         <div>
            <label for="">年龄</label>
            {{ form_emp.age }}<span>{{ form.age.errors.0 }}</span>
        </div>
         <div>
            <label for="">薪水</label>
            {{ form_emp.salary }}<span>{{ form.salary.errors.0 }}</span>
        </div>
    
         <input type="submit" value="submit">
    </form>

    3 方式三 利用for模板标签创建每一个input标签,并显示错误信息(推荐使用)

    <h3>方式三</h3>
    <form action="" method="post" novalidate>
    1   novalidate 不需要浏览器帮忙校验
    2   for field in form_emp  模板语法for循环创建input标签
    3   field.errors.0 显示错误信息
        {% csrf_token %}
        {% for field in form_emp %}
            <div>
            <label>{{ field.label }} 
                {{ field }}
            </label>
            <span style="color: red;">{{ field.errors.0 }}</span>
            </div>
        {% endfor %}
        <input type="submit" value="submit">
    </form>

    4 form组件类 (自定义label)

    class EmpForm(forms.Form):
        name=forms.CharField(min_length=5,label='姓名')
        age=forms.IntegerField(label='年龄')
        salary=forms.IntegerField(label='薪水')

    5 views中的逻辑

    def addEmp(request):
        if request.method=='GET':
            form_emp=EmpForm
            return render(request,'add.html',{'form_emp':form_emp})
        else:
            form_emp=EmpForm(request.POST)
            if form_emp.is_valid():
                enm_obj=models.Emp.objects.create(**form_emp.cleaned_data)
                return HttpResponse('添加成功!')
            else:
    
                return render(request, 'add.html', {'form_emp': form_emp})

    四  form组件的二层校验(钩子) ----灵活制定校验规则

    命名规范

    def clean_字段(self):
        '''二次校验规则 '''
    
    异常名称:ValidationError
    from django.core.exceptions import NON_FIELD_ERRORS,ValidationError

    实例代码(判断不能是纯数字,也不能存在相同名字)

    class EmpForm(forms.Form):
        name=forms.CharField(min_length=5,label='姓名')
        age=forms.IntegerField(label='年龄')
        salary=forms.IntegerField(label='薪水')
        def clean_name(self):
            val=self.cleaned_data.get('name')
            if val.isdigit():
                raise ValidationError("员工信息不能是纯数字")
            elif models.Emp.objects.filter(name=val):
                raise ValidationError('该员工已经存在')
            else:
                return val

  • 相关阅读:
    Linux安装nginx
    linux目录结构
    Django-admin
    celery
    Flask-Migrate
    Flask-Script
    Flask-SQLAlchemy
    SQLAlchemy
    mongodb的增删改查
    websocket的加密和解密过程
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10259287.html
Copyright © 2020-2023  润新知