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. clear:both;和overflow:hidden;的应用理解。

    摘自cbwcwy 前辈: clear是子模块之间限定的,如下:<div id="a">    <div id="1"></div& ...

  2. ceph-文件存储

    文件存储 ceph文件系统提供了任何大小的符合posix标准的分布式文件系统,它使用Ceph RADOS存储数据.要实现ceph文件系统,需要一个正在运行的ceph存储集群和至少一个ceph元数据服务 ...

  3. 关于Vue 兄弟组件通信

    最近项目中遇到希望在操作路由组件里面内容的时候可以影响共用组件Header组件(这个其实就是他的兄弟组件)的操作.  意思就是 router-view指向的router来影响Header组件的信息 首 ...

  4. 微信小程序清除默认样式

    1.清除button的默认样式 button::after{border:none;}input{outline:none;border:none;list-style: none;}

  5. 什么是shell 是不是什么时候都可以使用shell

    因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化.因此,Shell脚本只要"用心写"一次,即可应用到很多系统上.因此,之所以要使用Shell脚本是基于 ...

  6. Python系列6之面向对象

    目录 生成器和迭代器 字符串格式化 内置函数vars 反射 面向对象编程 一. 生成器和迭代器  1. 生成器 生成器具有一种生成的能力,它仅仅代表着一种生成的能力,当我们需要使用的时候,才会通过迭代 ...

  7. 对文件 I/O,标准 I/O 的缓冲的理解

    1.标准I/O缓冲区 要理解标准I/O,就要先知道文件I/O的业务逻辑. 下面图示为文件I/O 如执行下面的代码: write(fd, buf2, sizeof(buf2)); 图中 buf:就是bu ...

  8. Black Box POJ1442

    Description Our Black Box represents a primitive database. It can save an integer array and has a sp ...

  9. urllib使用四--urlencode,urlparse,

    urllib.urlencode 把字典数据转换为URL编码 # -*- coding: cp936 -*- import urllib params = {'score':100,'name':'爬 ...

  10. TensorFlow验证码识别

    本节我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里我们识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 验 ...