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实现将xml导入至excel
Nov 20 Python
Python pass详细介绍及实例代码
Nov 24 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
python读取几个G的csv文件方法
Jan 07 Python
python利用跳板机ssh远程连接redis的方法
Feb 19 Python
Python调用.NET库的方法步骤
Dec 27 Python
详解Python IO编程
Jul 24 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
Python机器学习之KNN近邻算法
May 14 Python
Python socket如何解析HTTP请求内容
Feb 12 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
文件上传类
2006/10/09 PHP
如何对PHP程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
python抓取百度首页的方法
2015/05/19 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
python中的二维列表实例详解
2018/06/19 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
毕业生简历自我评价范文
2014/04/09 职场文书
普通话宣传标语
2014/06/26 职场文书
防灾减灾活动总结
2014/08/30 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
学习雷锋主题班会
2015/08/14 职场文书