Django-Form表单(验证定制错误信息Select)
Posted Root用户
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django-Form表单(验证定制错误信息Select)相关的知识,希望对你有一定的参考价值。
![技术分享](https://image.cha138.com/20200630/4c5a273a5c034133ad7e52e4415447b8.jpg)
Django form 流程
1、创建类,继承form.Form
2、页面根据类的对象自动创建html标签
3、提交,request.POST
封装到类的对象里,obj=UserInfo(request.POST)
4、用户输入是否合法
obj.is_valid()
5、全部合法,获取全部内容
obj.clean()
6、只有有不合法
obj.errors
首先关闭跨站请求
#‘django.middleware.csrf.CsrfViewMiddleware‘,
![技术分享](https://image.cha138.com/20200630/7ceab744b8ae45fdb68f40a570b98051.jpg)
![技术分享](https://image.cha138.com/20200630/365dfc208db14a118116b9ba0276776c.jpg)
有错误会阻止提交,并提示错误信息
![技术分享](https://image.cha138.com/20200630/7600e3bbe1a84526a18c33ac4173ca6a.jpg)
成功提交,可以获取到提交的值
![技术分享](https://image.cha138.com/20200630/bbc1e2d2a0cd41e491a19df0456a0a90.jpg)
Form定制化
定制错误信息
mail = forms.EmailField(error_messages={‘required‘:u‘邮箱不能为空‘})
定制错误规则
mobile = forms.CharField(validators=[mobile_validate,],
error_messages={‘required‘:u‘手机不能为空‘})
from django.shortcuts import render from django import forms import re from django.core.exceptions import ValidationError def mobile_validate(value): mobile_re = re.compile(r‘^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$‘) if not mobile_re.match(value): raise ValidationError(‘手机号码格式错误‘) class UserInfo(forms.Form): email = forms.EmailField(error_messages={‘required‘:u‘邮箱不能为空‘}) host = forms.CharField(error_messages={‘required‘:u‘主机不能为空‘}) port = forms.CharField(error_messages={‘required‘:u‘端口不能为空‘}) mobile = forms.CharField(validators=[mobile_validate,], #定义错误规则函数 error_messages={‘required‘:u‘手机不能为空‘}, widget=forms.TextInput(attrs={‘class‘:‘form-control‘, #定义class ‘placeholder‘:u‘请输入手机号‘})) beizhu = forms.CharField(required=False, #备注允许为空 widget=forms.Textarea(attrs={‘class‘:‘form-control‘, #定义为多行输入框 ‘placeholder‘:u‘请输入备注‘})) user_type_choice = ( (0,u‘普通用户‘), (1,u‘高级用户‘), ) user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={‘class‘:‘form-control‘}))
![技术分享](https://image.cha138.com/20200630/bdaff95338e246d2be62deeb8dd95c0b.jpg)
![技术分享](https://image.cha138.com/20200630/74c1014bcdd045ad8c09e5f12faeaf31.jpg)
保存用户输入内容
obj = AccountForm.LoginForm(request.POST)
Form表单验证以及错误信息
错误信息格式:
普通格式:
from django.shortcuts import render,HttpResponse from web.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: #用于Form表单提交 error = obj.errors #print error[‘username‘][0] #print error[‘password‘][0] return render(request, ‘account/login.html‘,{‘obj‘:obj,‘error‘:error}) return render(request, ‘account/login.html‘,{‘obj‘:obj})
创建一个simple_tag,使其输 error[‘username‘][0]
![技术分享](https://image.cha138.com/20200630/a97bc76333794cd8b9a4b426d58164cb.jpg)
{% load xx %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/login/" method="post"> <p>{{ obj.username }} {% error_msg error.username %} </p> <p>{{ obj.password }} {% error_msg error.password %} </p> <input type="submit" value="提交"> </form>
![技术分享](https://image.cha138.com/20200630/132b3c226b8d426d8a7e80565731c0d5.jpg)
JSON格式
def login(request): obj = AccountForm.LoginForm(request.POST) if request.method == ‘POST‘: if obj.is_valid(): all_data = obj.clean() else: #用于Ajax error = obj.errors.as_json() #print error return HttpResponse(error) return render(request, ‘account/login.html‘,{‘obj‘:obj,‘error‘:error}) return render(request, ‘account/login.html‘,{‘obj‘:obj})
<body> <form action="/login/" method="post"> <p>{{ obj.username }} {% error_msg error.username %} </p> <p>{{ obj.password }} {% error_msg error.password %} </p> <input type="submit" value="Ajax提交" onclick="SubmitAjax()"> </form> <script src="{{ STATIC_URL }}js/jquery-2.1.4.min.js"></script> <script> function SubmitAjax(){ $.ajax({ url:‘/login/‘, type:‘POST‘, data:{‘username‘:‘‘,‘password‘:‘‘}, success:function(arg){ console.log(arg) } }) } </script> </body>
Form生成select标签
![技术分享](https://image.cha138.com/20200630/084c6313fc4f4dd69b671e54ee56faf0.jpg)
![技术分享](https://image.cha138.com/20200630/4c8c4ce5dd22487a98a50789c3c8ad02.jpg)
![技术分享](https://image.cha138.com/20200630/c115b5e6ce5b4854821b21f30b7db505.jpg)
静态select
![技术分享](https://image.cha138.com/20200630/ae415e436e20407e9bf0b8b6f66d6990.jpg)
动态select
![技术分享](https://image.cha138.com/20200630/476c2a509884438e87ff842f105d4947.jpg)
当增加数据库数据时
![技术分享](https://image.cha138.com/20200630/823dcc3ac3d2411bb1bbf1dab97dbbd2.jpg)
![技术分享](https://image.cha138.com/20200630/beff4e6f77824c0e8d34d6e2b460be9d.jpg)
不会更新,除非关闭程序,重新载入才会更新
![技术分享](https://image.cha138.com/20200630/ee7295663a3b491ca85fcc7c610f0839.jpg)
![技术分享](https://image.cha138.com/20200630/9cebb3d1bea147e8bb7c427f91195be2.jpg)
解决方法:利用面向对象类的静态字段
from django import forms import json class ImportForm(forms.Form): #静态select HOST_TYPE_LIST = ( (0,‘物理机‘), (1,‘虚拟机‘), ) host_type = forms.IntegerField( widget=forms.Select(choices=HOST_TYPE_LIST) ) hostname = forms.CharField() #动态select # admin_dic = ((1,‘yangmv‘),(1,"bob"),) # w_obj = open(‘db_admin‘,‘w‘) # w_obj.write(json.dumps(admin_dic)) # w_obj.close() f_obj = open(‘db_admin‘,‘r‘) data = f_obj.read() data_tuple = json.loads(data) admin = forms.IntegerField( widget=forms.Select(choices=data_tuple) ) def __init__(self,*args,**kwargs): super(ImportForm,self).__init__(*args,**kwargs) tmp = open(‘db_admin‘) data = tmp.read() data_tuple = json.loads(data) self.fields[‘admin‘].widget.choices = data_tuple
再次增加数据库数据,直接刷新页面即可读取到新数据
![技术分享](https://image.cha138.com/20200630/3f2d587a173c434eab80591916d83527.jpg)
![技术分享](https://image.cha138.com/20200630/258f016c47e544cca27cf2f3ecfff8e8.jpg)
优化后代码
from django import forms import json class ImportForm(forms.Form): admin = forms.IntegerField(widget=forms.Select()) def __init__(self,*args,**kwargs): super(ImportForm,self).__init__(*args,**kwargs) tmp = open(‘db_admin‘) data = tmp.read() data_tuple = json.loads(data) self.fields[‘admin‘].widget.choices = data_tuple
使用models获取select数据
(models操作,后面一偏文章会详细介绍)
class Select(models.Model): username = models.CharField(max_length=16) password = models.CharField(max_length=32)
<body> <form action="/home/"> <p>{{ obj.admin }}</p> </form> </body>
def home(request): obj = HomeForm.ImportForm() return render(request, ‘home/home.html‘,{‘obj‘:obj})
![技术分享](https://image.cha138.com/20200630/a7330efa933542d3a3a9bdbd811077d9.jpg)
models.Select.objects.all().values_list(‘id‘,‘username‘)
![技术分享](https://image.cha138.com/20200630/b2ec4b8943274e428b05cd76a2a28ee2.jpg)
![技术分享](https://image.cha138.com/20200630/36c506821076408b8d4fcc1e426bd27e.jpg)
以上是关于Django-Form表单(验证定制错误信息Select)的主要内容,如果未能解决你的问题,请参考以下文章