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进行行为驱动开发的入门教程
Apr 23 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
Python验证码识别的方法
Jul 10 Python
python中matplotlib实现最小二乘法拟合的过程详解
Jul 11 Python
用于业余项目的8个优秀Python库
Sep 21 Python
python TKinter获取文本框内容的方法
Oct 11 Python
python实现事件驱动
Nov 21 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
python3 深浅copy对比详解
Aug 12 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 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执行速度全攻略(上)
2006/10/09 PHP
用PHP制作静态网站的模板框架(二)
2006/10/09 PHP
php 购物车的例子
2009/05/04 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
Symfony生成二维码的方法
2016/02/04 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
ES6正则的扩展实例详解
2017/04/25 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
Python中random模块生成随机数详解
2016/03/10 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
播音主持女孩的自我评价分享
2013/11/20 职场文书
新学期开学寄语
2014/01/18 职场文书
节约用水演讲稿
2014/05/21 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
离婚上诉状范文
2015/05/23 职场文书
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js