form后台生成form里面的Input标签,以及设置Input的属性

# 需求 后台生成form里面的input标签,并设置input标签的属性,
class RegisterForm(Form):
email = fields.EmailField()
password = fields.CharField()
password2 = fields.CharField()
code = fields.CharField()
avatar = fields.FileField(widget=widgets.FileInput(attrs={'id': 'inputAvatar'})) def register(request):
if request.method == 'GET':
obj = RegisterForm()
return render(request, 'register.html', {'obj': obj}) <form method="POST" action="/register/" enctype="multipart/form-data">
{% csrf_token %}
{{ obj.avatar }}
{{ obj.usernam }}
</form>

向在form里面获取session值,即传递request参数

# form标签向获取request里面的值--重写__init__函数
def __init__(self, request, *args, **kwargs):
self.request = request
super(RegisterForm, self).__init__(*args, **kwargs)

form验证某个字段 self.clean_字段名

# form标签验证某个字段
def clean_code(self):
input_code = self.cleaned_data.get('code')
session_code = self.request.session.get('code') # 请查看check_code函数
if input_code != session_code:
raise ValidationError('验证码错误')
else:
return input_code
# self.errors = {'code': ['验证码错误'], 'xx':[错误1,错误2]}

form验证多个字段 self.clean

# form标签联合数据验证
def clean(self):
"""
此时,已经拿到所有的input值,对两次输入密码进行验证
"""
p1 = self.cleaned_data.get('password1')
p2 = self.cleaned_data.get('password2')
if p1 != p2:
raise ValidationError('两次输入密码不一致') # 默认放到self.errors['__all__']里面
else:
return self.cleaned_data
# return None
"""
self.errors = {'__all__': ['两次输入密码不一致'], 'xx':[错误1,错误2]}
NON_FIELD_ERRORS = '__all__' 前台获取需要用到
此时前端获取该错误; obj.non_field_errors
"""

form验证多个字段 self.clean 指明错误信息的Key,方便前端使用

# 对整体错误的其他设置
def clean(self): if p1 != p2:
self.add_error('password2', '两次输入密码不一致')
# 此时不用抛出异常了,因为抛出异常
# 抛出异常也是执行self.add_error
return None
else:
return self.cleaned_data 此时在前端显示该错误: obj.errors.password2

form 的错误信息self.errors

# form标签数据验证错误信息
self.errors = {'username':[错误1, 错误2], 'password': [错误1, 错误2]}
def clean_xx(self) 如果遇到错,放到self.errors['xx']里面
def clean(self) 如果遇到错,放到self.errors['__all__']里面 但是如果要前端获取self.errors['__all__']错误,obj.errors.__all__是拿不到的
而是obj.non_field_errors, 不是self.errors.non_fields_errors

注册form

# 完整的forms.py
# -*- coding: utf-8 -*-
from django.forms import Form, fields, widgets
from django.core.exceptions import ValidationError class RegisterForm(Form):
username = fields.CharField(widget=widgets.TextInput(
attrs={'class': "form-control"}
))
password = fields.CharField(widget=widgets.PasswordInput(
attrs={'class': "form-control"}
))
password2 = fields.CharField(widget=widgets.PasswordInput(
attrs={'class': "form-control"}
))
code = fields.CharField(widget=widgets.TextInput(
attrs={'class': "form-control"}
))
avatar = fields.FileField(widget=widgets.FileInput(attrs={'id': 'inputAvatar'})) def __init__(self, request, *args, **kwargs):
self.request = request
super(RegisterForm, self).__init__(*args, **kwargs) def clean_code(self):
input_code = self.cleaned_data.get('code').upper()
session_code = self.request.session.get('code').upper() # 请查看check_code函数
if input_code != session_code:
raise ValidationError('验证码错误')
else:
return input_code
# self.errors = {'code': ['验证码错误'], 'xx':[错误1,错误2]} def clean(self):
"""
此时,已经拿到所有的input值,对两次输入密码进行验证
"""
p1 = self.cleaned_data.get('password')
p2 = self.cleaned_data.get('password2')
if p1 != p2:
self.add_error('password2', '两次输入密码不一致') # 此时不用抛出异常了,因为抛出异常
# 抛出异常也是执行self.add_error
return None
# raise ValidationError('两次输入密码不一致')
# 默认放到self.errors['__all__']里面
# 执行的是self.add_error('__all__', '两次输入密码不一致')
else:
return self.cleaned_data """
self.errors = {'__all__': ['两次输入密码不一致'], 'xx':[错误1,错误2]}
NON_FIELD_ERRORS = '__all__' 前台获取需要用到
"""

[oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息的更多相关文章

  1. jquery获取form表单内容以及绑定数据到form表单

    在日常开发的过程中,难免会用到form表单,我们需要获取表单的数据保存到数据库,或者拿到后台的一串json数据,要将数据绑定到form表单上,这里我写了一个基于jquery的,formHelp插件,使 ...

  2. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

  3. Django 提交 form 表单(使用sqlite3保存数据)

    优化 提交 form 表单,https://www.cnblogs.com/klvchen/p/10608143.html 创建数据库的字段,在 models.py 中添加 from django.d ...

  4. JavaScript之form表单的序列化和json化[form.js]

    一.应用场景 form提交时,使用ajax提交. 二.效果 通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form ...

  5. Ajax提交form表单内容和文件(jQuery.form.js)

    jQuery官网是这样介绍form.js A simple way to AJAX-ify any form on your page; with file upload and progress s ...

  6. form表单转换为Json字符串数据

    https://github.com/marioizquierdo/jquery.serializeJSON 效果图 加载使用 <script type="text/javascrip ...

  7. form表单嵌套,用标签的form属性来解决表单嵌套的问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 由form表单来说说前后台数据之间的交互

    为什么从表单提交说起呢?因为大部分与后台的交互都是在form表单中实现,恰巧我入职一个月来都是在处理与后台交互的数据整合中度过,期间也发现一些小坑,出于喜欢总结,所以才想写这篇小博客. 各位童鞋,可以 ...

  9. 过滤器中获取form表单或url请求数据

    var httpFormData = filterContext.HttpContext.Request.Form; var logContent = string.Empty; //获取url的 l ...

随机推荐

  1. Spring Boot的Maven插件Spring Boot Maven plugin详解

    Spring Boot的Maven插件(Spring Boot Maven plugin)能够以Maven的方式为应用提供Spring Boot的支持,即为Spring Boot应用提供了执行Mave ...

  2. Spring Java配置

    Java配置 Java配置是Spring 4.x推荐的配置方式,可以完全替代xml配置:Java配置也是Sping Boot 推荐的配置方式.Java配置是通过@Configuration和@Bean ...

  3. 第18章 SysTick—系统定时器—零死角玩转STM32-F429系列

    第18章     SysTick—系统定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  4. C#中 property 与 attribute的区别?

    C#中 property 与 attribute的区别?答:attribute:自定义属性的基类;property :类中的属性

  5. dts--tests(四)

    unit_tests.py """ DPDK Test suite. This TestSuite runs the unit tests included in DPD ...

  6. PLC状态机编程第一篇-状态机介绍

    状态机的一般概念 过去我在学习PLC编程时,看的大部分书仅仅停留在软件的操作上,没有真正讲述如何组织程序,这里我们讲一个通用的描述控制算法的方法,就是状态机,和SFC很类似,其实SFC也是源于状态机啦 ...

  7. java8之list集合中取出某一属性的方法

    上代码 List<User> list = new ArrayList<User>(); User user1 = new User("第一位"," ...

  8. POJ:3268-Silver Cow Party

    Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26184 Accepted: 11963 De ...

  9. POJ:3259-Wormholes(最短路判断负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 58153 Accepted: 21747 Descripti ...

  10. NumPy库入门

    ndarray数组的元素类型 ndarray数组的创建 ndarray数组的操作 ndarray数组的运算