表单字段的widget参数

    xiaoxiao2022-07-14  170

    小部件

    小部件是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">'
    最新回复(0)