zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10259287.html
Copyright © 2011-2022 走看看