为什么80%的码农都做不了架构师?>>>   

构建1个表单:

1、新建1个 forms.py 模块,并导入 django.forms 模块

2、在 forms.py 模块中定义1个 form 类,和 moldes 类 相似

3、在 views.py 导入forms.py模块, 并实例化1个 form 表单对象,并返回这个实例对象

4、在templates文件夹中 定义好form.html 模版

注意:

  • 如果前台html,没有创建form 可通过此方法在html直接创建from
  • 如果前台html,已有from表单 ,需要确保 from 字段名称 和 Input name 名称一致,才能使用Django 内置from 类验证

#forms.py

from django import forms                     #导入Django.forms 模块
from django.http import HttpRequestclass Alongin(forms.Form):username=forms.CharField(max_length=30)email=forms.EmailField(required=True)       #required 是否唯一ip=forms.GenericIPAddressField()

#view.py

from django.shortcuts import render
from app01.forms import Alongin   #从forms.py模块中 导入,Alongin类def form(request):obj=Alongin()     #实例化这个表单对象return render(request,'form.html',{'data':obj}) #在form.html 中返回这个obj对象

#form.html

<body><form action=' ' method='POST'> <div> {{data.username}}</div><div> {{data.email}}</div><div> {{data.ip}} </div></form>
</body>

FORM 外键 多对多字段

外键:forms.ModelChoiceField(queryset=models.UserGroup.objects.all())

多对多:forms.ModelMultipleChoiceField(queryset=models.Organizations.objects.all())

让外键字段数据随着model 更新而更新

def __init__(self, *args, **kwargs):super(UserInfoForm,self).__init__(*args, **kwargs)self.fields['user_type'].choices = models.UserType.objects.values_list('id','caption')

验证表单提交信息

1、is_valid 验证表单提交的内容是否合法 

注意中间只有1个下划线 ,根据是否合法,返回True 或 Faluse

#修改views.py

def form(request):obj=Alongin()                            #创建表单类if request.method=='POST':CheckForm=Alongin(request.POST)     #获取实例对象中传人的表单内容,一般是1个字典组成的对象CheckResust=CheckForm.is_valid()         #验证表单print(CheckForm,CheckResust ,sep="\n")  #以换行的方式打印return render(request,'form.html',{'data':obj})    #在html 中生成表单

2、实例化的from 类展现形式

from contact.forms import ContactForm
f = ContactForm()
print(f)
#输出 默认以html格式输出
<tr><th><label for="id_subject">Subject:</label></th><td><input type="text" name="subject" id="id_subject" /></td></tr>
<tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr>
<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_mmessage /></td></tr>

as_ul(): 列表形式返回
as_p()  :   段落形式返回

>>> print f.as_ul()
<li><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></li>
<li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li>
<li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>
>>> print f.as_p()
<p><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></p>
<p><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></p>
<p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>

3、一旦你实例化1个forms 类,就绑定1个form表单

可以用 is_bound 检测

f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'})
f.is_bound
》True #输出

4、cleaned_data 

输出request.POST提交信息, 返回1个字典 <class 'dict'>

提交后在数据库中保存

models.xxx.object.create(**obj.cleaned_data)

f.cleaned_data
{message': uNice site!, email: uadrian@example.com, subject: uHello}

5、检查每个表中的字段 errors 信息  .errors后面无()

def form(request):obj=Alongin() if request.method=='POST':CheckForm=Alongin(request.POST)print(CheckForm.errors)          #输出错误内容print(type(CheckForm.errors))    #输出错误类型
'''输出内容
1、CheckForm.errors:
<ul class="errorlist"><li>ip<ul class="errorlist"><li>Enter a valid IPv4 orIPv6 address.</li></ul></li>
</ul>
2、type(CheckForm.errors):
<class 'django.forms.utils.ErrorDict'>
'''

注意:1、当CheckForm.errors 的错误信息为多个时,程序默认以as_ul() 的方式输出
          2、通过type(CheckForm.errors) ,可发现它是1个django.forms.utils.ErrorDict 对象
          3、可以通过 ErrorDict  这个对象在前台模版人为的返回错误信息
                 ErrorDict  在django 1.10 中有5个属性,as_ul() ,as_json(),as_data(),as_text() ,__str__

                               特别说明: __str__ 默认返回 as_ul() 

6、前台展示request.POST 错误字段 (表单中提交的错误信息验证)

#后台views.py 代码

#可以通过 ErrorDict  这个对象,在前台模版人为的返回错误信息def form(request):obj=Alongin()                                  #定义1个对象   status={}                         #因为考虑请求具体为POST 和GET 所以定义1个全局变量,用于返回错误if request.method=='POST':CheckForm=Alongin(request.POST)CheckResust=CheckForm.is_valid()print(CheckForm,CheckResust ,sep="\n")       #输出 request.POST 提交信息,是否有错print(CheckForm.as_p())                      #输出 request.POST 提交信息 以段落方式展示 ,注意as_p() 加括号print(CheckForm.as_ul())                     #输出 request.POST 提交信息 以列表方式展示 ,注意as_ul() 加括号print(CheckForm.cleaned_data)                #输出格式化后的 request.POST信息print(CheckForm.errors)                      #输出错误内容print(type(CheckForm.errors))      #输出错误类型#定义这个错误对象 CheckForm.errors >>  utils.ErrorDictif CheckResust:                              # 为真 即 is_valid ==True return render(request,'form.html',{'data':obj})else:status=CheckForm.errorsreturn render(request,'form.html',{'data':obj,'status':status})

#前台模版 form.html

<form method='POST'> <div>用户名: {{data.username}}</div><div>邮箱: {{data.email}}</div><div>IP:{{data.ip}} </div><input type='submit' value='提交'></input><div style='color:red'> {{status.as_ul}} </div>  #注意这里的as_ul 为属性 不加()</form>

7、自定义错误信息

可在定义form 类的时候,添加自定义错误信息

error_messages :错误内容

required:必须的,不能为空

invalid:  格式错误

max_length: 最大长度

min_length:最小长度

from django import forms
class FM(forms.Form):username = forms.CharField(max_length=12,min_length=6,error_messages={'required':'用户名不能为空','max_length':'请输入最小长度为6位数的用户名','max_length':'用户名最大长度不能超过12位'})pwd = forms.CharField(max_length=12,min_length=6,error_messages={'required':'密码不能为空'})email =forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'})

其他错误内容,查看:https://my.oschina.net/esdn/blog/812417

转载于:https://my.oschina.net/esdn/blog/811176

Django Form 详解相关推荐

  1. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  2. Django URLS 详解

    Django URLS 详解 一.Path() 参数详解 path(route, view, kwargs=None, name=None) path中有4个参数,其中两个参数为必填,两个参数为非必填 ...

  3. python django restful_详解Django rest_framework实现RESTful API

    一.什么是REST 面向资源是REST最明显的特征,资源是一种看待服务器的方式,将服务器看作是由很多离散的资源组成.每个资源是服务器上一个可命名的抽象概念.因为资源是一个抽象的概念,所以它不仅仅能代表 ...

  4. [CentOS Python系列] 六.阿里云搭建Django网站详解

    本篇文章主要介绍讲述部署阿里云服务器Django网站环境,并通过IP地址访问网页的过程.写代码过程中往往第一步需要解决的就是配置开发环境,对于新手来说,这是非常头疼的事情,而当配置好之后或者对于老手来 ...

  5. Django—中间件详解

    Django-中间件 中间件的定义 定义:中间件是django请求/响应处理的钩子框架,它是一个轻量级的.低级的插件系统,用于全局改变django的输入或输出 中间件以类的形式体现 每个中间件组件负责 ...

  6. django 常用 详解

    Django1 django框架介绍是一个开源框架,2005年发布,采用Python语言编写的,早期时主要做新闻和内容管理的网站Django本身提供了非常强大的后台管理系统看中文说明文档百度[djan ...

  7. django http404 详解

    [引子] 今天在看django的官方文档的时候看到get_object_or_404这个函数感觉比较奇怪.这个主要来自于它的功能,如果要查询的对象 存在那么就返回对象:如果对象不存在那么就要报404 ...

  8. python全栈示例_Python全栈之路--Django ORM详解

    ORM:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 我们写的类表示数据库中的表 我们 ...

  9. 前端之 form 详解

    认识表单 在一个页面上可以有多个form表单,但是向web服务器提交表单的时候,一次只可以提交一个表单. 要声明一个表单,只需要使用 form 标记来标明表单的开始和结束,若需要向服务器提交数据,则在 ...

  10. Django中间件详解

    中间件的定义 定义:中间件是django请求/响应处理的钩子框架,它是一个轻量级的.低级的插件系统,用于全局改变django的输入或输出 中间件以类的形式体现 每个中间件组件负责一些特定的功能,例如: ...

最新文章

  1. 3.6 激活函数-深度学习-Stanford吴恩达教授
  2. 网维大师服务器不运行,网维大师客户机连不上的解决方法
  3. Centos 6.4使用本地yum源
  4. 给JavaScript的单个对象定义属性和属性的元数据
  5. 开工啦~Spring 完美导入 IDEA
  6. 豆瓣评分 9.4 的编程巨著!《算法》
  7. 一个简单混合协议通讯列子,物联网和互联网通讯。
  8. python基础之字符编码、文件处理
  9. cogs2514 艺术
  10. Filter过滤器概念及生命周期
  11. EMI/EMC设计经典问答
  12. 修改django后台管理员密码
  13. 微信公众平台测试帐号申请及Token验证地址提供
  14. 【Python数据分析与可视化】Pandas统计分析-实训
  15. linux ping不通自动关机脚本,服务器断电自动关机bat脚本
  16. python绿色版_mPython最新下载_mPython绿色版 - 软件帝
  17. c#子线程调用主线程控件
  18. 6. 中文命名实体提取
  19. 2016.11.29遇到的问题
  20. Android与Linux分道扬镳

热门文章

  1. 不使用任何判断比较两个整数
  2. 内存管理的概念及作用
  3. 反射的应用之动态代理,顺便复习静态代理
  4. 2020 金山云 面经
  5. Java:关于负数的向上转型
  6. java基础学习(3)
  7. admin登录 404_Shiro Springboot 集群共享Session (Redis)+单用户登录
  8. DNS服务双解析邮箱地址
  9. Chisel:一款基于HTTP的快速稳定TCPUDP隧道工具
  10. Hugging Face Course-Diving in 抱抱脸 Tokenizers library (WordPiece tokenization Unigram tokenization)