小部件
小部件是Django对HTML输入元素的表示。窗口小部件处理HTML的呈现,以及从与窗口小部件对应的GET / POST字典中提取数据。
指定小部件
无论何时在表单上指定字段,Django都将使用适合于要显示的数据类型的默认窗口小部件。要查找在哪个字段上使用哪个窗口小部件,请参阅有关内置字段类的文档 。
但是,如果要为字段使用不同的窗口小部件,则只需widget在字段定义上使用该参数即可。例如:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField(widget=forms.Textarea)
这将指定一个带有注释的表单,该注释使用更大的Textarea 小部件,而不是默认TextInput小部件。
自定义窗口小部件有两种方法:每个窗口小部件实例和每个窗口小部件类。
样式小部件实例
在真实的Web页面上,您可能不希望每个小部件看起来都一样。您可能需要更大的注释输入元素,并且您可能希望“名称”小部件具有一些特殊的CSS类。也可以指定’type’属性以利用新的HTML5输入类型。为此,您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'}))
您还可以在表单定义中修改窗口小部件:
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField()
name.widget.attrs.update({'class': 'special'})
comment.widget.attrs.update(size='40')
或者,如果字段未直接在表单上声明(例如模型表单字段),则可以使用以下Form.fields属性:
class CommentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['name'].widget.attrs.update({'class': 'special'})
self.fields['comment'].widget.attrs.update(size='40')
基本小部件类
基本窗口小部件类Widget,MultiWidget由所有内置窗口小部件子类化,可以作为自定义窗口小部件的基础。
Widget
classWidget(attrs = None)[来源]
此抽象类无法呈现,但提供了基本属性 attrs。您还可以render()在自定义小部件上实现或覆盖该 方法。
attrs
包含要在呈现的窗口小部件上设置的HTML属性的字典。
>>> from django import forms
>>> name = forms.TextInput(attrs={'size': 10, 'title': 'Your name'})
>>> name.render('name', 'A name')
'<input title="Your name" type="text" name="name" value="A name" size="10">'
如果为属性赋值True或赋值False,则它将呈现为HTML5布尔属性:
>>> name = forms.TextInput(attrs={'required': True})
>>> name.render('name', 'A name')
'<input name="name" type="text" value="A name" required>'
>>>
>>> name = forms.TextInput(attrs={'required': False})
>>> name.render('name', 'A name')
'<input name="name" type="text" value="A name">'