Django的form组件

forms组件

forms组件,是一个类。在视图函数中创建一个类,类需要继承forms.Form

from django import  forms

1.校验数据

步骤和语法:

  1. 创建一个forms类,该类需继承forms.Form  , 得到一个类(假设为EmpForm),用于校正数据

  2.把用户信息传给ef=EmpForm(request.POST),得到一个form对象ef(传入的数据必须为字典)

  3. ef.is_valid()  ,数据都合格为True ,否则为False

  4.ef.is_valid()之后可以获取两部分数据:

    ef.cleand_data  获取合格后的数据,为字典

    ef.errors 不合格数据以及错误信息

  

model.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=8,decimal_places=2)

视图函数中:

from django.shortcuts import render,HttpResponse,redirect
from aap1 import models
# Create your views here.
from django import forms
#forms 组件是一个类,对数据进行校正,下面是分别对name,age 字段进行较正
class EmpForm(forms.Form):
    #且所有要校正的字段必须为非空,否则会报错
    name = forms.CharField(max_length=5)  #name需要校验的字段 ,forms. 后面跟的是规则对象,此处为CharField()
    age = forms.IntegerField() #此校验规则,必须为一个数字

def addemp(request):

    if request.method=="GET":
        return render(request,"add.html")

    else:
        #获取字段值
        # name =request.POST.get("name")
        # age =request.POST.get("age")
        # salary =request.POST.get("salary")
        # # 类 ,操作简单,耦合性比较好
        ef = EmpForm(request.POST) #得到一个form对象
        if ef.is_valid():
            print(ef.cleaned_data) #得到校正合格之后的数据,也是一个字典
            models.Emp.objects.create(**ef.cleaned_data) #传入一个字典,但是这样创建的话,需要将Emp中所有字段都进行校验或默认
        else:
            print(ef.errors) #得到错误信息字典
        return HttpResponse("ok")

2.渲染页面

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=8,decimal_places=2)
#后端views.py 文件中:(form组件的构建)

from django import forms
from django.core.exceptions import ValidationError
#forms 组件是一个类,创建一个需要渲染或检验的form组件
class EmpForm(forms.Form):
    #且所有要校正的字段必须为非空,否则会报错
    name = forms.CharField(max_length=5,label="姓名",error_messages={"required":"该字段不能为空"})  #name需要校验的字段 ,forms. 后面跟的是规则对象,此处为CharField()
    age = forms.IntegerField(label="年龄") #此校验规则,必须为一个数字
    salary=forms.CharField(label="薪水")
#视图函数,def addemp(request):

    if request.method=="GET":
        form =EmpForm()
        return render(request,"add.html",locals()) # locals(),将form 中所有的字段都可以传给前端页面进行渲染

    else:
        #post请求得到,request.post 接收到前端传来的数据中的key必须和form组件中的字段名一样,不然无法进行校正,也就不能像下面一样传值
        form = EmpForm(request.POST) #得到一个form对象
        if form.is_valid(): #校正通过
            print(form.cleaned_data) #得到干净的数据
            models.Emp.objects.create(**form.cleaned_data) #数据干净后创建员工
            return HttpResponse("添加成功")
        else:        #校正没通过后向前端显示错误信息
            print(form.errors)
            return render(request,"add.html",{"form":form})

渲染方式一:

<h3>渲染方式1</h3>
<form action="">
    {% csrf_token %}
    {{ form.as_p }}   #
    <input type="submit">
</form>

渲染后:

<h3>渲染方式1</h3>
<form action="">
    <input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb">
    <p><label for="id_name">姓名:</label> <input type="text" name="name" maxlength="5" required id="id_name"></p>
   <p><label for="id_age">年龄:</label> <input type="number" name="age" required id="id_age"></p>
   <p><label for="id_salary">薪水:</label> <input type="text" name="salary" required id="id_salary"></p>
    <input type="submit">
</form>

页面效果:

渲染方式二:

前端代码:

<h3>渲染方式2</h3>
<form action="">
    {% csrf_token %}
    <div>
        <label for="">姓名</label>
        {{ form.name }}
    </div>
     <div>
        <label for="">年龄</label>
        {{ form.age }}
    </div>
     <div>
        <label for="">薪水</label>
        {{ form.salary }}
    </div>

    <input type="submit">
</form>

渲染后:

<h3>渲染方式2</h3>
<form action="">
    <input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb">
    <div>
        <label for="">姓名</label>
        <input type="text" name="name" maxlength="5" required id="id_name">
    </div>
     <div>
        <label for="">年龄</label>
        <input type="number" name="age" required id="id_age">
    </div>
     <div>
        <label for="">薪水</label>
        <input type="text" name="salary" required id="id_salary">
    </div>

    <input type="submit">
</form>

页面效果:

渲染方式三:

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

渲染后:

<h3>渲染方式3</h3>
<form action="" method="post" novalidate>
    <input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb">

    <div>
        <label for="">姓名</label>
        <input type="text" name="name" maxlength="5" required id="id_name"> <span></span>
    </div>

    <div>
        <label for="">年龄</label>
        <input type="number" name="age" required id="id_age"> <span></span>
    </div>

    <div>
        <label for="">薪水</label>
        <input type="text" name="salary" required id="id_salary"> <span></span>
    </div>

    <input type="submit">
</form>

效果图:

3.显示错误与重置输入信息功能

视图:

def register(request):

    if request.method=="POST":
        form=UserForm(request.POST)
        if form.is_valid():
            print(form.cleaned_data)       # 所有干净的字段以及对应的值
        else:
            print(form.cleaned_data)       #
            print(form.errors)             # ErrorDict : {"校验错误的字段":["错误信息",]}
            print(form.errors.get("name")) # ErrorList ["错误信息",]
        return render(request,"register.html",locals())
    form=UserForm()
    return render(request,"register.html",locals())

模板:

<form action="" method="post" novalidate>
    {% csrf_token %}

    {% for field in form %}
        <div>
            <label for="">{{ field.label }}</label>
            {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
        </div>
    {% endfor %}
    <input type="submit" class="btn btn-default">

</form>

4.局部钩子与全局钩子

视图

# forms组件
from django.forms import widgets

wid_01=widgets.TextInput(attrs={"class":"form-control"})
wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

from django.core.exceptions import ValidationError
class UserForm(forms.Form):
    name=forms.CharField(max_length=32,
                         widget=wid_01
                         )
    pwd=forms.CharField(max_length=32,widget=wid_02)
    r_pwd=forms.CharField(max_length=32,widget=wid_02)
    email=forms.EmailField(widget=wid_01)
    tel=forms.CharField(max_length=32,widget=wid_01)

    # 局部钩子
    def clean_name(self):
        val=self.cleaned_data.get("name")
        if not val.isdigit():
            return val
        else:
            raise ValidationError("用户名不能是纯数字!")

    # 全局钩子

    def clean(self):
        pwd=self.cleaned_data.get("pwd")
        r_pwd=self.cleaned_data.get("r_pwd")

        if pwd==r_pwd:
            return self.cleaned_data
        else:
            raise ValidationError(‘两次密码不一致!‘)

def register(request):

    if request.method=="POST":
        form=UserForm(request.POST)
        if form.is_valid():
            print(form.cleaned_data)       # 所有干净的字段以及对应的值
        else:
            clean_error=form.errors.get("__all__")

        return render(request,"register.html",locals())
    form=UserForm()
    return render(request,"register.html",locals())

模板

<form action="" method="post" novalidate>
            {% csrf_token %}

            {% for field in form %}
                <div>
                    <label for="">{{ field.label }}</label>
                    {{ field }}
                    <span class="pull-right" style="color: red">
                          {% if field.label == ‘R pwd‘ %}
                          <span>{{ clean_error.0 }}</span>
                          {% endif %}
                          {{ field.errors.0 }}
                    </span>
                </div>
            {% endfor %}
            <input type="submit" class="btn btn-default">

</form>

 

  

原文地址:https://www.cnblogs.com/knighterrant/p/10261126.html

时间: 2024-11-08 20:56:09

Django的form组件的相关文章

Python之路【第二十一篇】:Django之Form组件

Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from django.forms import Form from django.forms import widgets from django.forms imp

【Django】Form组件

目录 Form组件介绍 常用字段与插件 Form组件中所有内置字段 从数据库中获取数据 校验示例 检验手机号是否合法 方式一(基本操作) 方式二(自定义验证规则) 方式三(利用钩子) 验证密码一致性 钩子 局部钩子 全局钩子 进阶 批量添加样式 ModelForm Form套Form @ *** Form组件介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,

django之form组件、cookie、session

django之form组件.cookie.session django form组件 1.渲染标签 2.校验数据 3.展示信息 校验数据 # 第一步需要一个form类 from django import forms class MyForm(forms.Form): name = forms.CharField(max_length=8) password = forms.CharField(max_length=8,min_length=3) email = forms.EmailField

Django之Form组件

Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 from django.forms import Form from django.forms import widgets from django.forms import fields class MyForm(Form): user = fields.CharField( widget=widgets.Tex

[oldboy-django][2深入django]初始Form组件

http://www.cnblogs.com/wupeiqi/articles/6144178.html 1 初始Form组件 # Form验证(初始Form组件验证) - 问题: - 无法记住上次提交的内容,页面刷新数据消失 - 重复进行提交数据的校验(数据是否为空,长度大小等等) - 解决方法:django Form组件 - 定义规则(数据的格式,字段必须和表单上name属性一致) class LoginForm(Form): 实例化对象obj = LoginForm(request.POS

Django中Form组件拾遗(比较坑爹的地方+易忽略的点)

[001]Form组件之自动渲染一个ID选择器 在前面的章节中,我们使用了Django自带的Form组件帮我们完成对表单数据的校验,借助于Form组件,它帮我们自动渲染出input输入框,之前没怎么注意这块,最近才发现 它帮我们渲染出的input输入框自带了id选择器,来看如下的截图就明白了,这个地方坑了很久: <input class="form-control" id="id_email" name="email" placeholde

Python学习(三十九)—— Django之Form组件

一.构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method="post"> <label for="your_name">Your name: </label> <input id="your_name" type="text" name="your

Django框架-Form组件

一.DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如验证用户是否输入,输入的长度和格式等是否正确,如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息. Django Form组件就实现了上面所述的功能. 1.生成页面可用的html标签(生成input框) 2.对用户提交的数据进行校验 3.错误信息的展示 4.保留上次的输入 缺

Django的form组件应用登陆或者注册

from django import forms from django.forms import Form from django.forms import widgets from django.forms import fields from django.core.exceptions import ValidationError from blog.models import * class RegisterForm(Form): # 自定义form组件 username = fiel

Django中Form组件的使用

Form介绍 HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确.如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.. Django form组件就实现了上面所述的功能. 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 普通方式手写注册功能 views.p