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',
 
 
有错误会阻止提交,并提示错误信息
成功提交,可以获取到提交的值
 
 
 
 
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'}))

  

 
 
 
保存用户输入内容
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]
 
 
{% 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>

  

 
 
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标签


静态select
动态select

当增加数据库数据时
不会更新,除非关闭程序,重新载入才会更新


解决方法:利用面向对象类的静态字段

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

  

 
再次增加数据库数据,直接刷新页面即可读取到新数据
 
优化后代码
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})

 

models.Select.objects.all().values_list('id','username')
 
 
 
 
 
 
 
 

Django-Form表单(验证、定制、错误信息、Select)的更多相关文章

  1. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

  2. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  3. Python自动化之ajax返回表单验证的错误信息和序列化扩展

    form内置序列化错误 如果使用form提交数据的时候,可以直接返回错误信息到模板里面进行渲染 但是如果使用ajax处理呢 from django import forms from django.f ...

  4. django form 表单验证

  5. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

  6. web框架-(六)Django补充---form表单验证

    一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...

  7. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  8. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  9. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  10. 九 Django框架,Form表单验证

    表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

随机推荐

  1. ANR基础

    转自:http://blog.sina.com.cn/s/blog_c0de2be70102wd1k.html 1.ANR basic knowledge ANR分类: Key Dispatch Ti ...

  2. .NET4.0 加密通讯协议下TLS 的兼容支持问题.

    Study From https://stackoverflow.com/questions/28286086/default-securityprotocol-in-net-4-5 The defa ...

  3. Memcache 服务管理脚本

    自定义脚本将memcached作为系统服务启动以及开机启动. 一.编写脚本 在/etc/init.d/目录下新建一个脚本,名称为:memcached.内容如下: vi /etc/init.d/memc ...

  4. matlab dist函数

    dist——欧式距离加权函数(Euclidean distance weight function) 语法: Z = dist(W,P)    df = dist('deriv')    D = di ...

  5. Qt托盘程序

    使用QSystemTrayIcon类可以实现托盘程序.在这里使用QMainWindow做实例: mainwindow.h头文件 #ifndef MAINWINDOW_H #define MAINWIN ...

  6. ButterKnife注入注解框架用法

    Android 依赖注入 ButterKnife 基本使用 - 渐行渐远渐无声 - 博客园http://www.cnblogs.com/fansen/p/5653887.html ButterKnif ...

  7. Android ProgressBar的使用

    Android 基础教程之-------Android ProgressBar的使用http://blog.csdn.net/Android_Tutor/article/details/5695170 ...

  8. 解题:BZOJ 4644 经典砂比题(雾

    题面 初见线段树分治 (对我来说可不是什么经典题=.=) 把时间轴建出来一棵线段树,然后在对应的区间上打标记,最后把整棵树DFS一遍,到叶节点输出答案即可 (把最终答案开成全局的了调了半天 #incl ...

  9. 线程属性API

    数据类型:pthread_attr_t 操作API: // 初始化线程属性 int pthread_attr_init(pthread_attr_t *attr);// 初始化为系统支持的所有属性的默 ...

  10. linux操作系统位数

    方法1:getconf LONG_BIT 查看 如下例子所示: 32位Linux系统显示32, 64位Linux系统显示64.最简单.快捷的方法. [root@DB-Server ~]# getcon ...