Form表单的功能

  • 准备数据、重构数据,以便下一步提交。
  • 为数据创建HTML 表单
  • 接收并处理客户端提交的表单和数据

普通字段详解:

  1. class BooleanField(**kwargs):
  2. 默认的WidgetCheckboxInput
  3. 空值:False
  4. 规范化为:Python True False
  5. 如果字段带有required=True,验证值是否为True(例如复选框被勾上)。
  6. 错误信息的键:required

布尔值 checkbox

  1. class CharField(**kwargs):
  2. 默认的WidgetTextInput
  3. 空值:''(一个空字符串)
  4. 规范化为:一个Unicode 对象。
  5. 如果提供,验证max_length min_length 否则,所有的输入都是合法的。
  6. 错误信息的键:required, max_length, min_length
  7. 有两个参数用于验证:
  8.  
  9. max_length
  10. min_length
  11. 如果提供,这两个参数将确保字符串的最大和最小长度。

charFied input()

  1. class ChoiceField(**kwargs
  2. 默认的WidgetSelect
  3. 空值:''(一个空字符串)
  4. 规范化为:一个Unicode 对象。
  5. 验证给定的值在选项列表中存在。
  6. 错误信息的键:required, invalid_choice
  7. invalid_choice 错误消息可能包含%(value)s,它将被选择的选项替换掉。
  8.  
  9. 接收一个额外的必选参数:choices
  10. 用来作为该字段选项的一个二元组组成的可迭代对象(例如,列表或元组)或者一个可调用对象。
  11. 例如:
  12. YEAR_IN_SCHOOL_CHOICES = (
  13. ('FR', 'Freshman'),
  14. ('SO', 'Sophomore'),
  15. ('JR', 'Junior'),
  16. ('SR', 'Senior'),
  17. )

ChoiceField (select标签)

  1. class DateField(**kwargs):
  2. 默认的WidgetDateInput
  3. 空值:None
  4. 规范化为:一个Python datetime.date 对象。
  5. 验证给出的值是一个datetime.datedatetime.datetime 或指定日期格式的字符串。
  6. 错误信息的键:required, invalid
  7. 接收一个可选的参数:
  8.  
  9. input_formats
  10. 一个格式的列表,用于转换一个字符串为datetime.date 对象。

DateField Dateinput 标签

  1. class EmailField(**kwargs)
  2. 默认的WidgetEmailInput
  3. 空值:''(一个空字符串)
  4. 规范化为:一个Unicode 对象。
  5. 验证给出的值是一个合法的邮件地址,使用一个适度复杂的正则表达式。
  6. 错误信息的键:required, invalid
  7. 具有两个可选的参数用于验证,max_length min_length。如果提供,这两个参数确保字符串的最大和最小长度。

emailField EaillInput

  1. class FileField(**kwargs
  2. 默认的WidgetClearableFileInput
  3. 空值:None
  4. 规范化为:一个UploadedFile 对象,它封装文件内容和文件名为一个单独的对象。
  5. 可以验证非空的文件数据已经绑定到表单。
  6. 错误信息的键:required, invalid, missing, empty, max_length
  7. 具有两个可选的参数用于验证,max_length allow_empty_file。如果提供,这两个参数确保文件名的最大长度,而且即使文件内容为空时验证也会成功。

FileField

  1. class ImageField(**kwargs
  2. 默认的WidgetClearableFileInput
  3. 空值:None
  4. 规范化为: An UploadedFile object that wraps the file content and file name into a single object.
  5. 验证文件数据已绑定到表单,并且该文件具有Pillow理解的图像格式。
  6. 错误信息的键:required, invalid, missing, empty, invalid_image
  7. 使用ImageField需要安装Pillow并支持您使用的图像格式。如果在上传图片时遇到损坏 图像错误,通常意味着Pillow不了解其格式。要解决这个问题,请安装相应的库并重新安装Pillow

ImageField

  1. class MultipleChoiceField(**kwargs
  2. 默认的WidgetSelectMultiple
  3. 空值:[](一个空列表)
  4. 规范化为:一个Unicode 对象列表。
  5. 验证给定值列表中的每个值都存在于选择列表中。
  6. 错误信息的键:required, invalid_choice, invalid_list
  7. invalid_choice错误消息可能包含%(value)s,将替换为所选择的选项。
  8.  
  9. 对于ChoiceField,需要一个额外的必需参数choices

MultipleChoiceField (select标签 multiple)

处理关系的字段:

两个字段可用于表示模型之间的关系:ModelChoiceFieldModelMultipleChoiceField。这两个字段都需要单个queryset参数,用于创建字段的选择。

  1. class ModelChoiceField(**kwargs
  2. 默认的WidgetSelect
  3. 空值:None
  4. 规范化为:一个模型实例。
  5. 验证给定的id存在于查询集中。
  6. 错误信息的键:required, invalid_choice
  7. 可以选择一个单独的模型对像,适用于表示一个外键字段。 ModelChoiceField默认widet不适用选择数量很大的情况,在大于100项时应该避免使用它。
  8.  
  9. 需要单个参数:
  10. queryset
  11. 将导出字段选择的模型对象的QuerySet,将用于验证用户的选择。
  12. ModelChoiceField也有两个可选参数:
  13. empty_label
  14. 默认情况下,ModelChoiceField使用的<select>小部件将在列表顶部有一个空选项。您可以使用empty_label属性更改此标签的文本(默认为"---------"),也可以禁用空白标签完全通过将empty_label设置为None
  15. to_field_name
  16. 此可选参数用于指定要用作字段窗口小部件中选项的值的字段。确保它是模型的唯一字段,否则选定的值可以匹配多个对象。默认情况下,它设置为None,在这种情况下,将使用每个对象的主键。
  17. 例如:
  18. field1 = forms.ModelChoiceField(queryset=...)
  19. <select id="id_field1" name="field1">
  20. <option value="obj1.pk">Object1</option>
  21. <option value="obj2.pk">Object2</option>
  22. ...
  23. </select>

ModelChoiceField

  1. class ModelMultipleChoiceField(**kwargs)
  2. 默认的WidgetSelectMultiple
  3. 空值:QuerySet (self.queryset.none())
  4. 规范化为: 模型实例的一个QuerySet
  5. 验证在给定的值列表中的每个id存在于查询集中。
  6. 错误信息的键:required, list, invalid_choice, invalid_pk_value
  7. invalid_choice消息可以包含%(value)s并且invalid_pk_value消息可以包含%(pk)s其将被适当的值代替。
  8.  
  9. 允许选择适合于表示多对多关系的一个或多个模型对象。与ModelChoiceField一样,您可以使用label_from_instance自定义对象表示,queryset是必需的参数:
  10.  
  11. queryset
  12. 将导出字段选择的模型对象的QuerySet,将用于验证用户的选择。

ModelMultipleChoiceField

表单里choice用的数据库里数据时不会实时更新。所以需要将choice放到init里,每次使用都执行一遍:

  1. class FooMultipleChoiceForm(forms.Form):
  2. foo_select = forms.ModelMultipleChoiceField(queryset=None)
  3.  
  4. def __init__(self, *args, **kwargs):
  5. super(FooMultipleChoiceForm, self).__init__(*args, **kwargs)
  6. self.fields['foo_select'].queryset = ...

示例

字段的核心参数:

required

  f = forms.CharField(required=False)
  默认为True。

label

  1. >>> from django import forms
  2. >>> class CommentForm(forms.Form):
  3. ... name = forms.CharField(label='Your name')
  4. ... url = forms.URLField(label='Your Web site', required=False)
  5. ... comment = forms.CharField()
  6. >>> f = CommentForm(auto_id=False)
  7. >>> print(f)
  8. <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr>
  9. <tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr>
  10. <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>

error_messages:

error_messages 参数让你覆盖字段引发的异常中的默认信息。传递的是一个字典,其键为你想覆盖的错误信息

has_changed():方法用于决定字段的值是否从初始值发生了改变。返回True 或False

字段数据:

不管表单提交的是什么数据,一旦通过调用is_valid() 成功验证(is_valid() 返回True),验证后的表单数据将位于form.cleaned_data 字典中。

  1. from django.core.mail import send_mail
  2.  
  3. if form.is_valid():
  4. subject = form.cleaned_data['subject']
  5. message = form.cleaned_data['message']
  6. sender = form.cleaned_data['sender']
  7. cc_myself = form.cleaned_data['cc_myself']
  8.  
  9. recipients = ['info@example.com']
  10. if cc_myself:
  11. recipients.append(sender)
  12.  
  13. send_mail(subject, message, sender, recipients)
  14. return HttpResponseRedirect('/thanks/')

重写验证方法:

  1. # 自定义方法(局部钩子),密码必须包含字母和数字
  2. def clean_password(self):
  3. if self.cleaned_data.get('password').isdigit() or self.cleaned_data.get('password').isalpha():
  4. raise ValidationError('密码必须包含数字和字母')
  5. else:
  6. return self.cleaned_data['password']
  7.  
  8. def clean_valid_code(self): # 检验验证码正确;之前生成的验证码保存在了了session中
  9. if self.cleaned_data.get('valid_code').upper() == self.request.session.get('valid_code'):
  10. return self.cleaned_data['valid_code']
  11. else:
  12. raise ValidationError('验证码不正确')
  13.  
  14. # 自定义方法(全局钩子, 检验两个字段),检验两次密码一致;
  15. def clean(self):
  16. if self.cleaned_data.get('password') != self.cleaned_data.get('password2'):
  17. raise ValidationError('密码不一致')
  18. else:
  19. return self.cleaned_data
  20.  
  21. # 注意,上面的字典取值用get, 因为假如在clean_password中判断失败,那么没有返回值,最下面的clean方法直接取值就会失败s 

使用表单模:

  • {{ form.as_table }} 以表格的形式将它们渲染在<tr> 标签中
  • {{ form.as_p }}  将它们渲染在<p> 标签中
  • {{ form.as_ul }} 将它们渲染在<li> 标签中

手工渲染字段:{{ form.name_of_field }

  1. {{ form.non_field_errors }}
  2. <div class="fieldWrapper">
  3. {{ form.subject.errors }}
  4. <label for="{{ form.subject.id_for_label }}">Email subject:</label>
  5. {{ form.subject }}
  6. </div>
  7. <div class="fieldWrapper">
  8. {{ form.message.errors }}
  9. <label for="{{ form.message.id_for_label }}">Your message:</label>
  10. {{ form.message }}
  11. </div>
  12. <div class="fieldWrapper">
  13. {{ form.sender.errors }}
  14. <label for="{{ form.sender.id_for_label }}">Your email address:</label>
  15. {{ form.sender }}
  16. </div>
  17. <div class="fieldWrapper">
  18. {{ form.cc_myself.errors }}
  19. <label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label>
  20. {{ form.cc_myself }}
  21. </div>

示例

渲染表单的错误信息:{{ form.name_of_field.errors }}

迭代表单的字段{{ field }} 包含所有有用的属性

  1. {% for field in form %}
  2. <div class="fieldWrapper">
  3. {{ field.errors }}
  4. {{ field.label_tag }} {{ field }}
  5. </div>
  6. {% endfor %}

可重用的表单模板:

在表单保存到单独的模块,用includ标签来重用

  1. {% include "form_snippet.html" %}
  2.  
  3. # In form_snippet.html:
  4. {% for field in form %}
  5. <div class="fieldWrapper">
  6. {{ field.errors }}
  7. {{ field.label_tag }} {{ field }}
  8. </div>
  9. {% endfor %}

widgets窗口小部件 

widgets.attr 设置标签属性

  1. class CommentForm(forms.Form):
  2. name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
  3. url = forms.URLField()
  4. comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))
  5.  
  6. >>> f = CommentForm(auto_id=False)
  7. >>> f.as_table()
  8. <tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr>
  9. <tr><th>Url:</th><td><input type="url" name="url"/></td></tr>
  10. <tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr
  1. 生成form field对象,指定类型
  1. from django.form impor widgets,fields
  2.  
  3. xxxx = fields.CharField(widget=widgets.Textarea)

Django---form 详解的更多相关文章

  1. Django -- settings 详解

    Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目录下,开发情况下不需要,我们通常会在当前文件夹运 ...

  2. Django -- settings 详解(转)

    Django -- settings 详解   Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目 ...

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

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

  4. Django中间件详解

    Django中间件详解 中间件位置 WSGI 主要负责的就是负责和浏览器和应用之家沟通的桥梁 浏览器发送过来一个http请求,WSGI负责解包,并封装成能够给APP使用的environ,当app数据返 ...

  5. Django之Form详解

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 1.创建Form类.View函数处理 from ...

  6. Django框架详解之url

    Django基本命令 下载Django pip3 install django 创建一个django project django-admin.py startproject cms 当前目录下会生成 ...

  7. Django路由详解

    一.路由基础 1.路由url函数:路由自上而下进行匹配:url(正则路径,视图函数内存地址,默认参数,路由别名) 2.路由正则: 规定开始:^ | 规定结束:$ #url(r'index', view ...

  8. Django框架详解之views

    一个简单的视图 一个视图函数,是一个简单的python函数,它接受web请求并且返回web响应.无论视图本身包含什么逻辑,都要返回响应.为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为 ...

  9. django 常用 详解

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

  10. Django虚拟环境详解

    Django虚拟环境之 Virtualenv 1.安装 pip install virtualenv 2.创建虚拟环境 创建虚拟环境文件夹在当前目录 virtualenv [env_name] 3.激 ...

随机推荐

  1. 【MVC】View与Control之间数据传递

    1. Controller向View传递数据 使用ViewData传递数据[弱类型,字典型ViewDataDictionary] ViewData[“Message_ViewData”] = “ He ...

  2. https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html--swot

    https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html

  3. apache spark kubernets 部署试用

    spark 是一个不错的平台,支持rdd 分析stream 机器学习... 以下为使用kubernetes 部署的说明,以及注意的地方 具体的容器镜像使用别人已经构建好的 deploy yaml 文件 ...

  4. tomcat catalina.out切割脚本

    shell脚本catalina.out 切割脚本...每天23.30切割.删除七天之前的日志这里3个tomcat实例(1)拷贝日志文件(2)清空日志文件*只能清空如果删除tomcat不重启不会生成新的 ...

  5. angularJS自定义服务的几种方式

    在angularJS中定义服务共有四种常见的方式:factory,service,provider,constant,value 使用形式的不同: 1)factory以返回对象的形式定义服务: mya ...

  6. MySQL 瓶颈及应对措施

    注:内容摘抄自<PHP 核心技术与最佳实践>一书 MySQL 是存在瓶颈的. 当 MySQL 单表数据量达到千万级别以上时,无论如何对 MySQL 进行优化,查询如何简单,MySQL 的性 ...

  7. Gradle Build速度加快终极方法(android studio)

    Android Studio用起来越来越顺手,但是却发现Build的速度实在不敢恭维,在google和度娘了几把(....)之后,大体就是分配更高的内存,步骤:Setting-->搜索gradl ...

  8. ALGO-6_蓝桥杯_算法训练_安慰奶牛

    记: 本题目考的是最小生成数,可使用Kruskal算法 第一次,20分 原因:使用动态数组,有概率报运行错误(大雾= =) 第二次,100分 原因:改用静态数组,一次过 示例代码: #include ...

  9. Oracle 树操作(select…start with…connect by…prior)---转

    原文地址:http://www.cnblogs.com/linjiqin/p/3152674.html -----------

  10. 读取 Excel 之 NPOI

    HSSFWorkbook hssfworkbook; void InitializeWorkbook(string path) { //read the template via FileStream ...