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 相关文章推荐
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
python中for用来遍历range函数的方法
Jun 08 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
postman传递当前时间戳实例详解
Sep 14 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
Python基于百度API识别并提取图片中文字
Jun 27 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实现递归复制整个文件夹的类实例
2015/08/03 PHP
php修改数组键名的方法示例
2017/04/15 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
Python lxml模块安装教程
2015/06/02 Python
python中函数总结之装饰器闭包详解
2016/06/12 Python
使用Python和xlwt向Excel文件中写入中文的实例
2018/04/21 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
Django分组聚合查询实例分享
2020/04/29 Python
python如何写出表白程序
2020/06/01 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
酒店经理职责
2014/01/30 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
音乐教育感言
2014/03/05 职场文书
文秘自荐信
2014/06/28 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
2016党员党课心得体会
2016/01/07 职场文书
合作合同协议书
2016/03/21 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js