• django组件之form


    form组件

    首先要了解form组件的一些基本语法:

    1.  校验数据:
        form组件校验的是字典,所以数据应该以字典形式传进去
        form 校验,可以多传数据,不要紧(只校验form组件有的,但是少栓不行)

        但是不能少传,就是说form组件有的字段都应该有的

        ef=EmpFoem(dict) 构造对象

      ef.is_valid() 方法:校验

      切记:只有经过is_valid才有有下面两个属性
        经过is_valid校验的数据会把数据封装到两个对象:

        object.cleaned_data     #验证通过,干净的数据

        object.errors           #验证不通过,错误的信息

    form组件功能之校验功能

      针对一个添加员工功能详解:

      模型models.py

    from django.db import models
    
    # Create your models here.
    class Emp(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()
        salary=models.DecimalField(max_digits=5,decimal_places=2)

      添加页面

      addEmp.html

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

      视图函数views.py

      

    from django.shortcuts import render,HttpResponse
    from app01 import models
    from django.core.exceptions import NON_FIELD_ERRORS,ValidationError
    # Create your views here.


    from django import forms #导入form组件 class EmpForm(forms.Form): #要继承form组件,要不然他就是普通的一个类,下面的字段是规则(约束) name=forms.CharField(min_length=5,label='姓名',error_messages={'required':'该字段不能为空'}) age=forms.IntegerField(label='年龄') salary=forms.CharField(label='薪水')
    def addEmp(request):
    if request.method=='GET':
    return render(request,'addEmp.html',locals())
    else:
    # print(request.POST)
    data=request.POST #这是一个字典对象可以直接传
    form=EmpForm(data) #用传进来的数据构造对象
    if form.is_valid():
    print(form.cleaned_data)
    print(form.errors)
    models.Emp.objects.create(**form.cleaned_data)

    return HttpResponse('添加成功')
    else:
    print(form.cleaned_data)
    print(form.errors)
    return render(request,'addEmp.html',locals())
     

    form组件之渲染标签功能 

      首先要明确的是,不管哪一种渲染方法,都不会帮你构建form表单,提交按钮,以及csrf_token钥匙,所以说这三部分都需要自己去构建.

       views.py

    def addEmp(request):
        if request.method=='GET':
            form=EmpForm() #空的form,用来渲染页面的
            return render(request,'addEmp.html',locals())
        else:
            # print(request.POST)
            data=request.POST  #这是一个字典对象可以直接传
            form=EmpForm(data)  #用传进来的数据构造对象
            if form.is_valid():
                print(form.cleaned_data)
                print(form.errors)
                models.Emp.objects.create(**form.cleaned_data)
    
                return HttpResponse('添加成功')
            else:
                print(form.cleaned_data)
                print(form.errors)
            return  render(request,'addEmp.html',locals())

    渲染方式一

    <h3>渲染方法一</h3>
    <form action="" method="post">
        {% csrf_token %}
        {{ form.as_p }}                       #循环打印,把form中的字段一一打印出来
        <input type="submit">
    </form>

       效果:

      

    渲染方式二

    <h3>渲染方法二</h3>
    <form action="" method="post" novalidate>
        {% csrf_token %}
        <div>
            <label for="">姓名</label>
            {{ form.name }} <span>{{ form.name.errors.0 }}</span>
        </div>
        <div>
            <label for="">年龄</label>
            {{ form.age }}<span>{{ form.age.errors.0 }}</span>
        </div>
        <div>
            <label for="">薪水</label>
            {{ form.salary }} <span>{{ field.form.errors.0 }}</span>
        </div>
        <input type="submit" value="提交">
    </form>

      效果:

      

    渲染方式三

    <h3>渲染方法三</h3>
    <form action="" method="post" novalidate>
        {% csrf_token %}
        {% for field in form %}
            <div>
                <label for="">{{ field.label }}</label>
                {{ field }} <span>{{ field.errors.0 }}</span>
            </div>
        {% endfor %}
        <input type="submit">
    </form>

       效果:

    form组件之显示错误与重置输入信息功能

      视图views.py

    def addEmp(request):
        if request.method=='GET':                      #第一次请求get渲染输入标签给客户端
            form=EmpForm()
            return render(request,'addEmp.html',locals())
        else: 
            # print(request.POST)                             #post请求
            data=request.POST  #这是一个字典对象可以直接传  
            form=EmpForm(data)  #用传进来的数据构造对象  
            if form.is_valid():                #把构造的对象进行校验
                print(form.cleaned_data)
                print(form.errors)                #校验通过就写入数据库
                models.Emp.objects.create(**form.cleaned_data)
    
                return HttpResponse('添加成功')
            else:                         #校验不通过
                print(form.cleaned_data)
                print(form.errors)
            return  render(request,'addEmp.html',locals())  #校验过后还是渲染一个页面返回会用户.只不过这个页面渲染的已经不是一个空form对象,而是用户输入的信息对象
                                      #form=EmpForm(data),同时我们可以在input标签放置span标签,把错误信息赋值给span

       models.py

    <h3>渲染方法三</h3>
    <form action="" method="post" novalidate>
        {% csrf_token %}
        {% for field in form %}
            <div>
                <label for="">{{ field.label }}</label>
                {{ field }} <span>{{ field.errors.0 }}</span>
            </div>
        {% endfor %}
        <input type="submit">
    </form>

    form组件之局部钩子与全局钩子

      views.py

    from django import forms  #导入form组件
    class EmpForm(forms.Form):  #要继承form组件,要不然他就是普通的一个类,下面的字段是规则(约束)
        name=forms.CharField(min_length=5,label='姓名',error_messages={'required':'该字段不能为空'})
        age=forms.IntegerField(label='年龄')
        salary=forms.CharField(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
        def clean_age(self):
            val=self.cleaned_data.get("age")
            if int(val) > 100:
               raise ValidationError('年龄不能大于100')
            else:
                return val

    def addEmp(request):
    if request.method=='GET':
    form=EmpForm()
    return render(request,'addEmp.html',locals())
    else:
    # print(request.POST)
    data=request.POST #这是一个字典对象可以直接传
    form=EmpForm(data) #用传进来的数据构造对象
    if form.is_valid():
    print(form.cleaned_data)
    print(form.errors)
    models.Emp.objects.create(**form.cleaned_data)

    return HttpResponse('添加成功')
    else:
    print(form.cleaned_data)
    print(form.errors)
    return render(request,'addEmp.html',locals())

      页面addEmp.html

    <h3>渲染方法三</h3>
    <form action="" method="post" novalidate>
        {% csrf_token %}
        {% for field in form %}
            <div>
                <label for="">{{ field.label }}</label>
                {{ field }} <span>{{ field.errors.0 }}</span>
            </div>
        {% endfor %}
        <input type="submit">
    </form>
    
    
  • 相关阅读:
    Visual Detection of Lintel-Occluded Doors from a Single Image
    Linux下快速构建Android编译环境
    How to Train YOLOv4 on a Custom Dataset
    yolo v4 darknet colab
    Deep Image Matting
    给 MSYS2 添加中科大的源
    msys2 mingw64 ffmpeg 搭建最新ffmpeg编译环境 可用 ffmpeg 4.1 及更新版本
    GB28181对接摄像机/NVR视频流
    video.js在iframe中如何解决无法自动播放问题
    LiveGBS-摄像机网页低延时无插件直播实现
  • 原文地址:https://www.cnblogs.com/tjp40922/p/10257092.html
Copyright © 2020-2023  润新知