文档章节

Django Form 详解

明月知心
 明月知心
发布于 2016/12/23 22:15
字数 1267
阅读 213
收藏 1

构建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 HttpRequest

class 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.ErrorDict
        if CheckResust:                              # 为真 即 is_valid ==True 
            return render(request,'form.html',{'data':obj})
        else:
           status=CheckForm.errors
    return 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

© 著作权归作者所有

共有 人打赏支持
明月知心
粉丝 6
博文 158
码字总数 71882
作品 0
武汉
程序员
私信 提问
详解Django的CSRF认证

1.csrf原理 2.Django中的CSRF中间件 首先,我们知道Django中间件作用于整个项目。 在一个项目中,如果想对全局所有视图函数或视图类起作用时,就可以在中间件中实现,比如想实现用户登录判断...

任平生78
10/08
0
0
Django模型字段选项详解

字段选项(Field options) 下列参数是全部字段类型都可用的,而且都是可选择的。 null Field.null 如果为True,Django 将空值以NULL 存储到数据库中。默认值是 False。 字符串字段例如CharFie...

楠木楠
2016/09/25
716
0
通过Ajax方式上传文件

通过传统的form表单提交的方式上传文件: 不过传统的form表单提交会导致页面刷新,但是在有些情况下,我们不希望页面被刷新(即异步刷新),这种时候我们都是使用Ajax技术实现。 在js中添加$...

初雪之音
2016/08/03
61
0
解决Django 提交表单时403错误:CSRF verification failed. Request aborted .

Django提交表单报错如下: Forbidden (403) CSRF verification failed. Request aborted. Help Reason given for failure: CSRF token missing or incorrect. In general, this can occur wh......

zshzx
2017/04/23
0
0
windows上Python开发--3.Django的基础知识

最近两天下了班,没事学习了django的开发,今天做个总结。其实大家可以从百度,google搜到一些django的入门视频,初步了解一下django的框架。学习一些基础的概念和知识。本篇主要是对自己这两...

jackxu2015
2015/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

windows下让 jar 在后台运行的办法

windows下 运行 java jar 不出现 命令行 窗口 新建一个披处理 run.bat,内容如下 @echo off start javaw -jar xx.jar exit 双击运行即可。...

glen_xu
12分钟前
1
0
jdk1.8 lambda stream 指定的对象属性进行去重

原因:因为Stream提供的distinct()方法只能去除重复的对象,无法根据指定的对象属性进行去重,可以应付简单场景。 解决方案: //去重,共同信息保存到bizPledgeSupplierVOs里bizPledgeSupp...

INSISTQIAO
15分钟前
0
0
vue nextTick深入理解---vue性能优化、DOM更新时机、事件循环机制

定义[nextTick、事件循环] nextTick的由来: 由于vue的数据驱动视图更新是异步的,即修改数据的当下,视图不会立即更新,而是等同一事件循环中的所有数据变化完成之后再统一进行视图更新。...

JamesView
23分钟前
1
0
常用汉字编码

GB2312 仅包含大部分的常用简体汉字,但已经不能适应现在的需要; GB13000 由于GB2312的局限性,国家标准化委员会制定了GB13000编码; 但由于当时的硬件和软件都已经支持了GB2312,而GB13000...

晨猫
25分钟前
1
0
纳尼?我的Gradle build编译只要1s

https://juejin.im/post/5c00ec39e51d4555ec0394f6

SuShine
26分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部