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. CentOS6.7的安装

    VMware9的安装请阅读:  http://www.cnblogs.com/duanji/p/yueding.html CentOS6.7在VMware9中安装 1.启动VMware的画面 2.点击 ...

  2. Visual Studio 2013中UML建模功能

    1.新建项目-->模版-->建模项目 2.右键项目,添加新建项,, 3.自己摸索吧.

  3. SpringBoot整合Kotlin构建Web服务

    今天我们尝试Spring Boot整合Kotlin,并决定建立一个非常简单的Spring Boot微服务,使用Kotlin作为编程语言进行编码构建. 创建一个简单的Spring Boot应用程序.我会 ...

  4. Alpha 冲刺 —— 十分之七

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 学习MSI.CUDA 试运行软件并调试 ...

  5. Alpha 冲刺 —— 十分之四

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  6. WEB入门 四 CSS样式表深入

    学习内容 Ø        CSS选择器深入学习 Ø        CSS继承 Ø        CSS文本效果 Ø        CSS图片效果 能力目标 Ø        掌握CSS选择器的组合声 ...

  7. 解题:NOI 2009 管道取珠

    题面 考虑这个平方的实际意义,实际是说取两次取出一样的序列 那么设$dp[i][j][k][h]$表示第一次在上面取$i$个下面取$j$个,第二次在上面取$k$个下面取$h$个的方案数 等等$n^4$ ...

  8. @Html.DropDownListFor默认选中项

    http://q.cnblogs.com/q/73902/ 项目使用mvc4,给dropDownList指定默认值未选中 页面代码是: 1.未有默认选中值 Html.DropDownListFor(m ...

  9. laravel 实用扩展包

    1.beyondcode / laravel-self-diagnosis 环境检测.检测 php 版本.扩展 是否正常,数据库连接是否正常等 2.nunomaduro/larastan larave ...

  10. sidecar学习

    1.SideCar的出现 微服务的结构是细粒度的,由多个服务构成,支持不同的服务用不同的语言来编写,比如a服务用python,b服务用java,C服务用php等,我们称为异构语言,那么在利用zuul来 ...