博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django forms组件
阅读量:5098 次
发布时间:2019-06-13

本文共 4049 字,大约阅读时间需要 13 分钟。

一.编写表单类

通过Django提供的Form类来生成表单

注意事项:

  • 提前导入forms模块:from django import forms
  • 所有的表单类都要继承forms.Form类
  • 每个表单字段都有自己的字段类型比如CharField,它们分别对应一种HTML语言中的元素中的表单元素。
  • 字段中拥有不同的属性
from django import formsclass MyForm(forms.Form):    name = forms.CharField(max_length=10,min_length=3,label='用户名')    pwd = forms.CharField(max_length=10,min_length=3,label='密码')    email = forms.CharField(label='邮箱')#使用时实例化产生一个对象,传入要校验的数据(字典)myform = MyForm(request.POST)

二.渲染模板

第一种方式:可扩展性最高

用户名: {

{ myform.name }}

密码: {

{ myform.pwd }}

邮箱: {

{ myform.email }}

第二种方式:for循环form对象

{% for foo in myform %}

{

{ foo.label }}:{
{ foo }}

{% endfor %}

第三种方式:可扩展性最差,不推荐使用

{#{
{ myform.as_p }}#} {
{ myform.as_ul }}

三.渲染错误信息

视图层

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())

模板层

{% csrf_token %} {% for field in form %}
{
{ field }}
{
{ field.errors.0 }}
{% endfor %}

四.field常用的属性

1.field.label           字段对应的label信息2.field.label_tag       自动生成字段的label标签,注意与{
{ field.label }}的区别。3.field.value 当前字段的值,比如一个Email字段的值someone@example.com4.field.errors 包含错误信息的元素5.field.is_hidden 用于判断当前字段是否为隐藏的字段,如果是,返回True6.field.field 返回字段的参数列表。例如{
{ char_field.field.max_length }}7.field.help_text 字段的帮助信息

五. 使用表单验证数据

  1. Form.clean()

如果你要自定义验证功能,那么你需要重新实现这个clean方法。

  1. Form.is_valid()

调用is_valid()方法来执行绑定表单的数据验证工作,并返回一个表示数据是否合法的布尔值。

>>> data = {'subject': 'hello',...         'message': 'Hi there',...         'sender': 'foo@example.com',...         'cc_myself': True}>>> f = ContactForm(data)>>> f.is_valid()True

让我们试下非法的数据。下面的情形中,subject为空(默认所有字段都是必需的)且sender是一个不合法的邮件地址:

>>> data = {'subject': '',...         'message': 'Hi there',...         'sender': 'invalid email address',...         'cc_myself': True}>>> f = ContactForm(data)>>> f.is_valid()False
  1. Form.errors

表单的errors属性保存了错误信息字典:

>>> f.errors{'sender': ['Enter a valid email address.'], 'subject': ['This field is required.']}

在这个字典中,键为字段的名称,值为错误信息的Unicode字符串组成的列表。错误信息保存在列表中是因为字段可能有多个错误信息。

  1. Form.errors.as_data()

返回一个字典,它将字段映射到原始的ValidationError实例。

>>> f.errors.as_data(){'sender': [ValidationError(['Enter a valid email address.'])],'subject': [ValidationError(['This field is required.'])]}
  1. Form.errors.as_json(escape_html=False)

返回JSON序列化后的错误信息字典。

>>> f.errors.as_json(){"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],"subject": [{"message": "This field is required.", "code": "required"}]}
  1. Form.add_error(field, error)

向表单特定字段添加错误信息。

field参数为字段的名称。如果值为None,error将作为Form.non_field_errors()的一个非字段错误。

  1. Form.has_error(field, code=None)

判断某个字段是否具有指定code的错误。当code为None时,如果字段有任何错误它都将返回True。

  1. Form.non_field_errors()

返回Form.errors中不是与特定字段相关联的错误。

六.局部钩子

rom django.core.exceptions import NON_FIELD_ERRORS, ValidationErrordef clean_name(self):    val=self.cleaned_data.get("name")    ret=UserInfo.objects.filter(name=val)    if not ret:        return val    else:        raise ValidationError("该用户已注册!")def clean_tel(self):    val=self.cleaned_data.get("tel")    if len(val)==11:        return val    else:        raise  ValidationError("手机号格式错误")

七.全局钩子

def clean(self):    pwd=self.cleaned_data.get('pwd')    r_pwd=self.cleaned_data.get('r_pwd')    if pwd and r_pwd:        if pwd==r_pwd:            return self.cleaned_data        else:            raise ValidationError('两次密码不一致')    else:        return self.cleaned_data

转载于:https://www.cnblogs.com/louyefeng/p/10003730.html

你可能感兴趣的文章
使用GDI+位图数据扫描线处理图像的小技巧 from http://blog.csdn.net/maozefa/article/details/4533770...
查看>>
有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 问最后留下的是原来第几号的那位...
查看>>
游戏编程之六 游戏编程的特点
查看>>
MSSQL之十九 视图
查看>>
模板引擎
查看>>
SQL Server——查看支持的数据类型
查看>>
ES6里的解构赋值
查看>>
android 50 进程优先级
查看>>
numpy中的tile函数
查看>>
php编译安装configure完全配置够日常所用功能
查看>>
marquee 标签的使用详情
查看>>
js设计模式总结5
查看>>
12306需求分析
查看>>
wpf数据自动树结构
查看>>
sql语句+model.id+
查看>>
北漂中~
查看>>
Learning Cocos2d-x for XNA(7)——让Sprite动起来
查看>>
Oracle部署安装
查看>>
制作Java安装程序
查看>>
学习before和after伪元素
查看>>