django表单的Widgets使用详解


Posted in Python onJuly 22, 2019

前言

不要将Widget与表单的fields字段混淆。表单字段负责验证输入并直接在模板中使用。而Widget负责渲染网页上HTML表单的输入元素和提取提交的原始数据。widget是字段的一个内在属性,用于定义字段在浏览器的页面里以何种HTML元素展现。

一、指定使用的widget

每个字段都有一个默认的widget类型。如果你想要使用一个不同的Widget,可以在定义字段时使用widget参数。 像这样:

from django import forms

class CommentForm(forms.Form):
  name = forms.CharField()
  url = forms.URLField()
  comment = forms.CharField(widget=forms.Textarea)

这将使用一个Textarea Widget来展现表单的评论字段,而不是默认的TextInput Widget。

二、设置widget的参数

许多widget具有可选的额外参数,下面的示例中,设置了SelectDateWidget的years 属性,注意参数的传递方法:

from django import forms

BIRTH_YEAR_CHOICES = ('1980', '1981', '1982')
FAVORITE_COLORS_CHOICES = (
  ('blue', 'Blue'),
  ('green', 'Green'),
  ('black', 'Black'),
)

class SimpleForm(forms.Form):
  birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))
  favorite_colors = forms.MultipleChoiceField(
    required=False,
    widget=forms.CheckboxSelectMultiple,
    choices=FAVORITE_COLORS_CHOICES,
  )

三、为widget添加CSS样式

默认情况下,当Django渲染Widget为实际的HTML代码时,不会帮你添加任何的CSS样式,也就是说网页上所有的TextInput元素的外观是一样的。

看下面的表单:

from django import forms

class CommentForm(forms.Form):
  name = forms.CharField()
  url = forms.URLField()
  comment = forms.CharField()

这个表单包含三个默认的TextInput Widget,以默认的方式渲染,没有CSS类、没有额外的属性。每个Widget的输入框将渲染得一模一样,丑陋又单调:

>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" required /></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required /></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" required /></td></tr>

在真正的网页中,你可ending不想让每个Widget看上去都一样。可能想要给comment一个更大的输入框,可能想让‘name' Widget具有一些特殊的CSS类。

可以在创建Widget时使用Widget.attrs参数来实现这一目的:

class CommentForm(forms.Form):
  name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
  url = forms.URLField()
  comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))

注意参数的传递方式!

这次渲染后的结果就不一样了:

>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" class="special" required /></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required /></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" size="40" required /></td></tr>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python字典多条件排序方法实例
Jun 30 Python
Python实现拼接多张图片的方法
Dec 01 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
python实现超级马里奥
Mar 18 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
Python一行代码实现自动发邮件功能
May 30 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 #Python
超简单的Python HTTP服务
Jul 22 #Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 #Python
django框架CSRF防护原理与用法分析
Jul 22 #Python
全面了解django的缓存机制及使用方法
Jul 22 #Python
python logging模块书写日志以及日志分割详解
Jul 22 #Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 #Python
You might like
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
浅析javascript 定时器
2014/12/23 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
python实现批量修改文件名代码
2017/09/10 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
python 动态加载的实现方法
2017/12/22 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Python日期时间Time模块实例详解
2019/04/15 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
python中count函数简单的实例讲解
2020/02/06 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
最新党员思想汇报
2014/01/01 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang