Django--form验证及错误处理
2024-10-15 06:29:35
需求
from表单验证和ajax验证时返回的错误信息处理
速查
1、form表单提交时错误信息显示
views
1
2
|
error = form表单实例化对象.errors return render(request, '前端html' ,{ 'obj' :form表单实例化对象, 'error' :error}) #传到前端用simple_tag解析 |
html
1
2
|
{% load xx %} <!--导入自定义sample_tag语言文件--> < span >{% error_msg error.username %}</ span > <!--error.username当做参数传给error_msg函数,并获取返回值--> |
simple_tag
1
2
3
4
5
|
@register .simple_tag def error_msg(error_list): if error_list: return error_list[ 0 ] return '' |
2、ajax提交时错误信息返回
views
1
2
|
error = obj.errors.as_json() return HttpResponse(error) |
html
1
2
3
4
5
6
|
$.ajax({ success: function(arg){ //arg是返回值,必须是字符串 var callback_dict = $.parseJSON(arg); $('#uname_error').text(callback_dict.username[0].message); } }) |
知识点
obj=表单生成文件.表单创建的类(request.POST)
request.POST:所有提交信息
obj.is_valid():判断提交数据是否正确
obj.clean():获取提交的所有数据
obj.errors():获取提交的所有错误信息,有三种表示方式(as_ul、as_json、as_data):
form表单提交用默认的,type<class django.forms.utils.ErrorDict>
ajax返回信息用as_json(),type<'str'>
错误信息里包含的字段和form里的字段一样,错误是个列表,取值obj.errors['username'][0]
html中jinja2语法取字典是不能用errors['key']的方式,得用errors.key;如果获取obj.errors['username'][0],就得用sample_tag
详细
1、form表单提交时错误信息显示
app01/views/account.py
1
2
3
4
5
6
7
8
9
10
11
from
app01.forms
import
account as AccountForm
def
login(request):
obj
=
AccountForm.LoginForm(request.POST)
if
request.method
=
=
'POST'
:
if
obj.is_valid():
all_data
=
obj.clean()
else
:
error
=
obj.errors
return
render(request,
'account/login.html'
,{
'obj'
:obj,
'error'
:error})
return
render(request,
'account/login.html'
,{
'obj'
:obj})
为什么使用sample_tag去取值,而不取好了再传到html,因为如果字段很多的话,要分别定义每个的错误;
templates/login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{% load xx %}
<!--导入自定义sample_tag语言文件-->
<
html
lang
=
"en"
>
<
head
></
head
>
<
body
>
<
form
action
=
"/login/"
method
=
"post"
>
<
p
>
{{ obj.username }}
<
span
>{% error_msg error.username %}</
span
>
<!--error.username当做参数传给error_msg函数,并获取返回值-->
</
p
>
<
p
>
{{ obj.password }}<
span
>{% error_msg error.password %}</
span
>
</
p
>
<
input
type
=
"submit"
value
=
"submit"
/>
</
form
>
</
body
>
</
html
>
app01/templatetags/xx.py
1
2
3
4
5
6
7
8
9
10
from
django
import
template
from
django.utils.safestring
import
mark_safe
from
django.template.base
import
resolve_variable, Node, TemplateSyntaxError
register
=
template.Library()
@register
.simple_tag
def
error_msg(error_list):
if
error_list:
return
error_list[
0
]
browser
1
2
3
4
5
6
7
8
9
10
11
|
from app01.forms import account as AccountForm def login(request): obj = AccountForm.LoginForm(request.POST) if request.method = = 'POST' : if obj.is_valid(): all_data = obj.clean() else : error = obj.errors return render(request, 'account/login.html' ,{ 'obj' :obj, 'error' :error}) return render(request, 'account/login.html' ,{ 'obj' :obj}) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{% load xx %} <!--导入自定义sample_tag语言文件--> < html lang = "en" > < head ></ head > < body > < form action = "/login/" method = "post" > < p > {{ obj.username }} < span >{% error_msg error.username %}</ span > <!--error.username当做参数传给error_msg函数,并获取返回值--> </ p > < p > {{ obj.password }}< span >{% error_msg error.password %}</ span > </ p > < input type = "submit" value = "submit" /> </ form > </ body > </ html > |
1
2
3
4
5
6
7
8
9
10
|
from django import template from django.utils.safestring import mark_safe from django.template.base import resolve_variable, Node, TemplateSyntaxError register = template.Library() @register .simple_tag def error_msg(error_list): if error_list: return error_list[ 0 ] |
2、ajax提交时错误信息返回
ajax必须返回的是字符串,所以用as_json()格式。
先看as_json获取的信息格式
1
2
3
4
5
6
7
8
|
{ "username" : [ { "message" : "This field is required." , "code" : "required" } ], "password" : [ { "message" : "This field is required." , "code" : "required" } ] } |
app01/views/account.py
1
2
3
4
5
6
7
8
9
10
11
|
from app01.forms import account as AccountForm def login(request): obj = AccountForm.LoginForm(request.POST) if request.method = = 'POST' : if obj.is_valid(): all_data = obj.clean() else : error = obj.errors.as_json() return HttpResponse(error) return render(request, 'account/login.html' ,{ 'obj' :obj}) |
templates/login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
< form action = "/login/" method = "post" > < p > {{ obj.username }} < span id = "uname_error" ></ span > </ p > < p > {{ obj.password }} < span id = "pwd_error" ></ span > </ p > {# < input type = "submit" value = "submit" />#} < input type = "button" value = "AjaxSubmit" onclick = "AjaxSubmit();" /> </ form > < script src = "{{ STATIC_URL }}js/jquery-2.1.4.min.js" ></ script > < script type = "text/javascript" > function AjaxSubmit(){ $.ajax({ url: '/login/', type: 'POST', data: {'username':'','password':''}, //就当提交了一个空数据,制造错误 success: function(arg){ //arg是返回值,必须是字符串 var callback_dict = $.parseJSON(arg); $('#uname_error').text(callback_dict.username[0].message); $('#pwd_error').text(callback_dict.password[0].message); {# console.log(callback_dict.username[0].message)#} } }) } </ script > |
app01/forms/account.py
1
2
3
4
5
|
from django import forms class LoginForm(forms.Form): username = forms.CharField() password = forms.CharField(widget = forms.PasswordInput()) |
browser
最新文章
- Java 静态语句块、语句块、构造函数执行顺序
- GenericServlet,HttpServletRequest和HttpServletResponse
- Template 模式
- Python 坑爹之 代码缩进
- NET CORE 应用程序启动
- 使用GraceNote Web API发展Mac发现音乐信息的应用
- hdu - 4975 - A simple Gaussian elimination problem.(最大流量)
- WUI->;ACE权限
- Linux入门(10)——Ubuntu16.04使用pip3和pip安装numpy,scipy,matplotlib等第三方库
- 关于PHP 采集类
- wireshark基础学习—第二部分wireshark的基础操作
- Django请求生命周期
- [C++]线性链表之顺序表<;一>;
- dubbo源码分析10——服务暴露1_export()方法分析
- JavaScirpt对象原生方法
- VirtualBox安装android-x86-4.4-r2
- JS 字符串 作为变量名
- EF三种编程方式详细图文教程(C#+EF)之Code First
- java读取某个目录是否有新增文件(轮询)
- IOS----UIScrollerView的使用
热门文章
- 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)
- datetimebox
- Servlet表单Get和Post读取
- [转]javascript中基本类型和引用类型的区别分析
- Python中if __name__ == &#39;main&#39; 的作用和原理
- python一个简单的web服务器和客户端
- VS2010环境下MFC使用DataGrid绑定数据源
- debian的bt下载工具
- Avalon总线概述
- GOF23设计模式之单例模式(singleton)