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 文件中:

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Emp(models.Model):
  6. name =models.CharField(max_length=32) #后面跟的是约束对象
  7. age =models.IntegerField()
  8. salary =models.DecimalField(max_digits=8,decimal_places=2)

视图函数中:

  1. from django.shortcuts import render,HttpResponse,redirect
  2. from aap1 import models
  3. # Create your views here.
  4. from django import forms
  5. #forms 组件是一个类,对数据进行校正,下面是分别对name,age 字段进行较正
  6. class EmpForm(forms.Form):
  7. #且所有要校正的字段必须为非空,否则会报错
  8. name = forms.CharField(max_length=5) #name需要校验的字段 ,forms. 后面跟的是规则对象,此处为CharField()
  9. age = forms.IntegerField() #此校验规则,必须为一个数字
  10.  
  11. def addemp(request):
  12.  
  13. if request.method=="GET":
  14. return render(request,"add.html")
  15.  
  16. else:
  17. #获取字段值
  18. # name =request.POST.get("name")
  19. # age =request.POST.get("age")
  20. # salary =request.POST.get("salary")
  21. # # 类 ,操作简单,耦合性比较好
  22. ef = EmpForm(request.POST) #得到一个form对象
  23. if ef.is_valid():
  24. print(ef.cleaned_data) #得到校正合格之后的数据,也是一个字典
  25. models.Emp.objects.create(**ef.cleaned_data) #传入一个字典,但是这样创建的话,需要将Emp中所有字段都进行校验或默认
  26. else:
  27. print(ef.errors) #得到错误信息字典
  28. return HttpResponse("ok")

2.渲染页面

  1. models.py文件中:
  2.  
  3. from django.db import models
  4.  
  5. # Create your models here.
  6.  
  7. class Emp(models.Model):
  8. name =models.CharField(max_length=32) #后面跟的是约束对象
  9. age =models.IntegerField()
  10. salary =models.DecimalField(max_digits=8,decimal_places=2)
  1. #后端views.py 文件中:(form组件的构建)
  2.  
  3. from django import forms
  4. from django.core.exceptions import ValidationError
  5. #forms 组件是一个类,创建一个需要渲染或检验的form组件
  6. class EmpForm(forms.Form):
  7. #且所有要校正的字段必须为非空,否则会报错
  8. name = forms.CharField(max_length=5,label="姓名",error_messages={"required":"该字段不能为空"}) #name需要校验的字段 ,forms. 后面跟的是规则对象,此处为CharField()
  9. age = forms.IntegerField(label="年龄") #此校验规则,必须为一个数字
  10. salary=forms.CharField(label="薪水")
  1. #视图函数,
    def addemp(request):
  2.  
  3. if request.method=="GET":
  4. form =EmpForm()
  5. return render(request,"add.html",locals()) # locals(),将form 中所有的字段都可以传给前端页面进行渲染
  6.  
  7. else:
  8. #post请求得到,request.post 接收到前端传来的数据中的key必须和form组件中的字段名一样,不然无法进行校正,也就不能像下面一样传值
  9. form = EmpForm(request.POST) #得到一个form对象
  10. if form.is_valid(): #校正通过
  11. print(form.cleaned_data) #得到干净的数据
  12. models.Emp.objects.create(**form.cleaned_data) #数据干净后创建员工
  13. return HttpResponse("添加成功")
  14. else:
            #校正没通过后向前端显示错误信息
  15. print(form.errors)
  16. return render(request,"add.html",{"form":form})

渲染方式一:

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

渲染后:

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

页面效果:

渲染方式二:

前端代码:

  1. <h3>渲染方式2</h3>
  2. <form action="">
  3. {% csrf_token %}
  4. <div>
  5. <label for="">姓名</label>
  6. {{ form.name }}
  7. </div>
  8. <div>
  9. <label for="">年龄</label>
  10. {{ form.age }}
  11. </div>
  12. <div>
  13. <label for="">薪水</label>
  14. {{ form.salary }}
  15. </div>
  16.  
  17. <input type="submit">
  18. </form>

渲染后:

  1. <h3>渲染方式2</h3>
  2. <form action="">
  3. <input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb">
  4. <div>
  5. <label for="">姓名</label>
  6. <input type="text" name="name" maxlength="5" required id="id_name">
  7. </div>
  8. <div>
  9. <label for="">年龄</label>
  10. <input type="number" name="age" required id="id_age">
  11. </div>
  12. <div>
  13. <label for="">薪水</label>
  14. <input type="text" name="salary" required id="id_salary">
  15. </div>
  16.  
  17. <input type="submit">
  18. </form>

页面效果:

渲染方式三:

  1. <h3>渲染方式3</h3>
  2. <form action="" method="post" novalidate>
  3. {% csrf_token %}
  4. {% for flied in form %}
  5. <div>
  6. <label for="">{{ flied.label }}</label>
  7. {{ flied }} <span>{{ flied.errors.0 }}</span>
  8. </div>
  9. {% endfor %}
  10. <input type="submit">
  11. </form>

渲染后:

  1. <h3>渲染方式3</h3>
  2. <form action="" method="post" novalidate>
  3. <input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb">
  4.  
  5. <div>
  6. <label for="">姓名</label>
  7. <input type="text" name="name" maxlength="5" required id="id_name"> <span></span>
  8. </div>
  9.  
  10. <div>
  11. <label for="">年龄</label>
  12. <input type="number" name="age" required id="id_age"> <span></span>
  13. </div>
  14.  
  15. <div>
  16. <label for="">薪水</label>
  17. <input type="text" name="salary" required id="id_salary"> <span></span>
  18. </div>
  19.  
  20. <input type="submit">
  21. </form>

效果图:

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

视图:

  1. def register(request):
  2.  
  3. if request.method=="POST":
  4. form=UserForm(request.POST)
  5. if form.is_valid():
  6. print(form.cleaned_data) # 所有干净的字段以及对应的值
  7. else:
  8. print(form.cleaned_data) #
  9. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
  10. print(form.errors.get("name")) # ErrorList ["错误信息",]
  11. return render(request,"register.html",locals())
  12. form=UserForm()
  13. return render(request,"register.html",locals())

模板:

  1. <form action="" method="post" novalidate>
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
  8. </div>
  9. {% endfor %}
  10. <input type="submit" class="btn btn-default">
  11.  
  12. </form>

4.局部钩子与全局钩子

视图

  1. # forms组件
  2. from django.forms import widgets
  3.  
  4. wid_01=widgets.TextInput(attrs={"class":"form-control"})
  5. wid_02=widgets.PasswordInput(attrs={"class":"form-control"})
  6.  
  7. from django.core.exceptions import ValidationError
  8. class UserForm(forms.Form):
  9. name=forms.CharField(max_length=32,
  10. widget=wid_01
  11. )
  12. pwd=forms.CharField(max_length=32,widget=wid_02)
  13. r_pwd=forms.CharField(max_length=32,widget=wid_02)
  14. email=forms.EmailField(widget=wid_01)
  15. tel=forms.CharField(max_length=32,widget=wid_01)
  16.  
  17. # 局部钩子
  18. def clean_name(self):
  19. val=self.cleaned_data.get("name")
  20. if not val.isdigit():
  21. return val
  22. else:
  23. raise ValidationError("用户名不能是纯数字!")
  24.  
  25. # 全局钩子
  26.  
  27. def clean(self):
  28. pwd=self.cleaned_data.get("pwd")
  29. r_pwd=self.cleaned_data.get("r_pwd")
  30.  
  31. if pwd==r_pwd:
  32. return self.cleaned_data
  33. else:
  34. raise ValidationError('两次密码不一致!')
  35.  
  36. def register(request):
  37.  
  38. if request.method=="POST":
  39. form=UserForm(request.POST)
  40. if form.is_valid():
  41. print(form.cleaned_data) # 所有干净的字段以及对应的值
  42. else:
  43. clean_error=form.errors.get("__all__")
  44.  
  45. return render(request,"register.html",locals())
  46. form=UserForm()
  47. return render(request,"register.html",locals())

模板

  1. <form action="" method="post" novalidate>
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }}
  8. <span class="pull-right" style="color: red">
  9. {% if field.label == 'R pwd' %}
  10. <span>{{ clean_error.0 }}</span>
  11. {% endif %}
  12. {{ field.errors.0 }}
  13. </span>
  14. </div>
  15. {% endfor %}
  16. <input type="submit" class="btn btn-default">
  17.  
  18. </form>

forms组件知识补充:

  1. model用法:
  2. gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1)
  3. alex=Author.objects.all().first()

  4. alex.gender #
  5. alex.get_gender_display() # "男"
  6.  
  7. forms用法:
  8. # Create your models here.
  9. class Book(models.Model):
  10. title = models.CharField( max_length=32)
  11. pub_date=models.DateField()
  12. price=models.DecimalField(max_digits=5,decimal_places=2)
  13. state=models.IntegerField(choices=((1,"已出版"),(2,"未出版")),default=1)
  14. publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE,null=True)
  15. authors=models.ManyToManyField("Author",db_table="book2authors") # 创建关系表
  16. def __str__(self):
  17. return self.title
  18.  
  19. # forms组件:
  20. from django import forms
  21. class BookForm(forms.Form):
  22. title=forms.CharField(max_length=32)
  23. price=forms.DecimalField(max_digits=5,decimal_places=2)
  24. pub_date=forms.DateField()
  25. state=forms.ChoiceField(choices=((1,"已出版"),(2,"未出版"))) #在前端的的效果 <option value=1>已出版<option> <option value=2>未出版<option>
  26. # publish=forms.ChoiceField(choices=list(models.Publish.objects.all().values_list("pk","name")))
  27. publish=forms.ModelChoiceField(queryset=models.Publish.objects.all())
  28. authors=forms.ModelMultipleChoiceField(queryset=models.Author.objects.all())
  29.  
  30. # modelForm
  31. class BookModelForm(forms.ModelForm):
  32. class Meta:
  33. model=models.Book
  34. # fields=["title","price"]
  35. # exclude = ["title"]
  36. fields="__all__"
  37.  
  38. #ModelForm 参数配置
  39.  
  40. class BookModelForm(forms.ModelForm):
  41. class Meta:
  42. model=models.Book
  43. # fields=["title","price"]
  44. # exclude = ["title"]
  45. fields="__all__"
  46.  
  47. #定义标签属性
  48. widgets={
  49. "title":wid.TextInput(attrs={"class":"form-control"}),
  50. "price":wid.TextInput(attrs={"class":"form-control"})
  51. }
  52. error_messages={
  53. "title":{"required":"该字段不能为空"}
  54. }
  55. labels={
  56. "title":"书籍名称"
  57. }
  58.  
  59. def clean_title(self):
  60. val=self.cleaned_data.get("title")
  61. if val.startswith("yuan"):
  62. return val
  63. else:
  64. raise ValidationError("必须以yuan开头!")

Django的form组件的更多相关文章

  1. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

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

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  3. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

  4. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...

  5. Django之Form组件(一)

    Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...

  6. python框架之Django(10)-Form组件

    介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...

  7. 〖Python〗-- Django的Form组件

    [Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ...

  8. Django之Form组件验证

    今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类)    ·前端把数据提交过来 ·匹配规则 · ...

  9. django 使用form组件提交数据之form表单提交

    django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...

  10. web之Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

随机推荐

  1. Pytest 简明教程

    pytest-learn 通过文章 Python 单元测试框架之 Pytest 剖解入门(第一篇) 学习 Pytest. 有很多的第三方插件可以自定义扩展,并且支持 Allure,生成可视化的测试报告 ...

  2. ASP.NET Core2.1 中如何使用 Cookie和Session

    https://blog.csdn.net/canduecho/article/details/80651853 ASP.NET Core2.1的官方项目模板在创建的Razor Pages和MVC项目 ...

  3. P4822 [BJWC2012]冻结

    思路 和p4568类似的分层图最短路 从上一层向下一层连边权/2的边即可 代码 #include <cstdio> #include <algorithm> #include ...

  4. WebPack填坑笔记

    loader使用时不需要用require引入,在使用plugins(插件)才需要使用require引入 压缩js代码会导致热更新失效 所以开发环境先不要进行压缩 给css加前缀的 postcss-lo ...

  5. java中Properties类及读取properties中属性值

    本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...

  6. HDU 3635 Dragon Balls(带权并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3635 题意: 有n颗龙珠和n座城市,一开始第i颗龙珠就位于第i座城市,现在有2种操作,第一种操作是将x龙珠所在城 ...

  7. python学习 day013打卡 内置函数

    本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...

  8. C#深入多线程

    主线程: th = Thread.CurrentThread; //现在的线程为主线程 th.Name = "MainThread"; //set线程名字:主线程本身没有名字 th ...

  9. Windows下使用命令安装Python的scipy库出错的解决

    平时使用Python都是在Sublime下使用,不想使用IDE.使用各种库时安装也就是使用pip安装即可.来说说今天自己遇到的一个问题:使用scipy数学库时,使用命令: pip install sc ...

  10. 理解 Redis(1) - Redis 简介

    Redis 的含义 全称: REmote DIctionary Server 远程词典服务器 由于支持 string, list, set, ordered set, hash 等多重数据结构, 因此 ...