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'手机不能为空'})
 
  1. from django.shortcuts import render
  2. from django import forms
  3. import re
  4. from django.core.exceptions import ValidationError
  5. def mobile_validate(value):
  6. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  7. if not mobile_re.match(value):
  8. raise ValidationError('手机号码格式错误')
  9.  
  10. class UserInfo(forms.Form):
  11. email = forms.EmailField(error_messages={'required':u'邮箱不能为空'})
  12. host = forms.CharField(error_messages={'required':u'主机不能为空'})
  13. port = forms.CharField(error_messages={'required':u'端口不能为空'})
  14. mobile = forms.CharField(validators=[mobile_validate,], #定义错误规则函数
  15.       error_messages={'required':u'手机不能为空'},
  16.       widget=forms.TextInput(attrs={'class':'form-control', #定义class
  17.       'placeholder':u'请输入手机号'}))
  18.      beizhu = forms.CharField(required=False, #备注允许为空
  19.       widget=forms.Textarea(attrs={'class':'form-control', #定义为多行输入框
  20.       'placeholder':u'请输入备注'}))
  21. user_type_choice = (
  22.   (0,u'普通用户'),
  23.        (1,u'高级用户'),
  24.       )
  25. user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class':'form-control'}))

  

 
 
 
保存用户输入内容
  1. obj = AccountForm.LoginForm(request.POST)
 
 
 
 
 
 
Form表单验证以及错误信息
错误信息格式:
普通格式:
  1. from django.shortcuts import render,HttpResponse
  2. from web.forms import account as AccountForm
  3.  
  4. def login(request):
  5. obj = AccountForm.LoginForm(request.POST)
  6. if request.method == 'POST':
  7. if obj.is_valid():
  8. all_data = obj.clean()
  9. else:
  10. #用于Form表单提交
  11.        error = obj.errors
  12. #print error['username'][0]
  13. #print error['password'][0]
  14.        return render(request, 'account/login.html',{'obj':obj,'error':error})
  15.  
  16. return render(request, 'account/login.html',{'obj':obj})

  

创建一个simple_tag,使其输 error['username'][0]
 
 
  1. {% load xx %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title></title>
  7. </head>
  8. <body>
  9. <form action="/login/" method="post">
  10. <p>{{ obj.username }}
  11. {% error_msg error.username %}
  12. </p>
  13. <p>{{ obj.password }}
  14. {% error_msg error.password %}
  15. </p>
  16. <input type="submit" value="提交">
  17. </form>

  

 
 
JSON格式
  1. def login(request):
  2. obj = AccountForm.LoginForm(request.POST)
  3. if request.method == 'POST':
  4. if obj.is_valid():
  5. all_data = obj.clean()
  6. else:
  7. #用于Ajax
  8. error = obj.errors.as_json()
  9. #print error
  10. return HttpResponse(error)
  11. return render(request, 'account/login.html',{'obj':obj,'error':error})
  12. return render(request, 'account/login.html',{'obj':obj})
  1. <body>
  2. <form action="/login/" method="post">
  3. <p>{{ obj.username }}
  4. {% error_msg error.username %}
  5. </p>
  6. <p>{{ obj.password }}
  7. {% error_msg error.password %}
  8. </p>
  9. <input type="submit" value="Ajax提交" onclick="SubmitAjax()">
  10. </form>
  11.  
  12. <script src="{{ STATIC_URL }}js/jquery-2.1.4.min.js"></script>
  13. <script>
  14. function SubmitAjax(){
  15. $.ajax({
  16. url:'/login/',
  17. type:'POST',
  18. data:{'username':'','password':''},
  19. success:function(arg){
  20. console.log(arg)
  21. }
  22. })
  23. }
  24. </script>
  25. </body>

  

  

 
 
 
Form生成select标签


静态select
动态select

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


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

  1. from django import forms
  2. import json
  3.  
  4. class ImportForm(forms.Form):
  5. #静态select
  6. HOST_TYPE_LIST = (
  7. (0,'物理机'),
  8. (1,'虚拟机'),
  9. )
  10. host_type = forms.IntegerField(
  11. widget=forms.Select(choices=HOST_TYPE_LIST)
  12. )
  13. hostname = forms.CharField()
  14.  
  15. #动态select
  16. # admin_dic = ((1,'yangmv'),(1,"bob"),)
  17. # w_obj = open('db_admin','w')
  18. # w_obj.write(json.dumps(admin_dic))
  19. # w_obj.close()
  20. f_obj = open('db_admin','r')
  21. data = f_obj.read()
  22. data_tuple = json.loads(data)
  23. admin = forms.IntegerField(
  24. widget=forms.Select(choices=data_tuple)
  25. )
  26.  
  27. def __init__(self,*args,**kwargs):
  28. super(ImportForm,self).__init__(*args,**kwargs)
  29. tmp = open('db_admin')
  30. data = tmp.read()
  31. data_tuple = json.loads(data)
  32. self.fields['admin'].widget.choices = data_tuple

  

 
再次增加数据库数据,直接刷新页面即可读取到新数据
 
优化后代码
  1. from django import forms
  2. import json
  3.  
  4. class ImportForm(forms.Form):
  5. admin = forms.IntegerField(widget=forms.Select())
  6. def __init__(self,*args,**kwargs):
  7. super(ImportForm,self).__init__(*args,**kwargs)
  8. tmp = open('db_admin')
  9. data = tmp.read()
  10. data_tuple = json.loads(data)
  11. self.fields['admin'].widget.choices = data_tuple

  

 
 
 
 
使用models获取select数据
(models操作,后面一偏文章会详细介绍)

  1. class Select(models.Model):
  2. username = models.CharField(max_length=16)
  3. password = models.CharField(max_length=32)
  1. <body>
  2. <form action="/home/">
  3. <p>{{ obj.admin }}</p>
  4. </form>
  5. </body>
  1. def home(request):
  2. obj = HomeForm.ImportForm()
  3. 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. [转帖]USB-C和Thunderbolt 3连接线你搞懂了吗?---没搞明白.

    USB-C和Thunderbolt 3连接线你搞懂了吗? 2018年11月25日 07:30 6318 次阅读 稿源:威锋网 3 条评论 按照计算行业的风潮,USB Type-C 将会是下一代主流的接 ...

  2. Java多线程之ThreadLocal总结2

    ThreadLocal是什么 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  3. linq 左连接实现两个集合的合并

    //第一个集合为所有的数据 var specilist = new List<Me.SpecificationsInfo>(); var resultall = (from a in db ...

  4. poj3320 Jessica's Reading Problem

    Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The fina ...

  5. 【Java并发编程】之六:Runnable和Thread实现多线程的区别

    Java中实现多线程有两种方法:继承Thread类.实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下 ...

  6. windows和Ubantu双系统安装图解

    Win7 U盘安装Ubuntu16.04 双系统详细教程 安装主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: ...

  7. C++ 数据结构概念

    C++ 数据结构概念 数据结构起源 计算机从解决数值计算问题到解决生活中的问题 现实生活中的问题涉及不同个体间的复杂联系 需要在计算机程序中描述生活中个体间的联系 数据结构主要研究非数值计算程序问题中 ...

  8. MT【146】一边柯西,一边舍弃

    (2018浙江省赛9题)设$x,y\in R$满足$x-6\sqrt{y}-4\sqrt{x-y}+12=0$,求$x$的范围______ 解答:$x+12=6\sqrt{y}+4\sqrt{x-y} ...

  9. C标准库函数--文件IO操作函数。

    C标准库文件读写函数总结:都是对文件流进行输入输出的函数分为对文件的有格式读写以及无格式读写 一.文件的无格式读写根据每次读写字符的数量,分为三类:1.按字符读写文件 按字符读有三个函数:以下三个函数 ...

  10. bzoj1874 [BeiJing2009 WinterCamp]取石子游戏

    1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 925  Solved: 381[ ...