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脚本来实现最简单的FTP下载的教程
May 04 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
pandas 读取各种格式文件的方法
Jun 22 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
Spring实战之使用util:命名空间简化配置操作示例
Dec 09 Python
怎么快速自学python
Jun 22 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
Python3的进程和线程你了解吗
Mar 16 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
typecho插件编写教程(一):Hello World
2015/05/28 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python任务调度实例分析
2015/05/19 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
python3中str(字符串)的使用教程
2017/03/23 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
python基于Selenium的web自动化框架
2019/07/14 Python
python ssh 执行shell命令的示例
2020/09/29 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
正风肃纪剖析材料
2014/02/18 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python