如何在Django的CharField中添加占位符?
以这个非常简单的表单为例:
class SearchForm(Form):
q = forms.CharField(label='search')
这个表单在模板中会被渲染成:
<input type="text" name="q" id="id_q" />
不过,我想在这个字段上添加一个 placeholder
属性,值为 Search
,这样生成的HTML看起来会像这样:
<input type="text" name="q" id="id_q" placeholder="Search" />
我希望能通过一个字典或者类似的方式,把这个placeholder的值传递给表单类中的 CharField
:
q = forms.CharField(label='search', placeholder='Search')
那么,最好的实现方法是什么呢?
9 个回答
58
其他的方法都不错。不过,如果你不想指定某个字段(比如说在某些动态方法中),你可以使用这个:
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['email'].widget.attrs['placeholder'] = self.fields['email'].label or 'email@address.nl'
这也允许占位符根据指定实例的ModelForms来变化。
72
对于一个模型表单,你可以这样使用Meta类:
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'name': forms.TextInput(attrs={'placeholder': 'Name'}),
'description': forms.Textarea(
attrs={'placeholder': 'Enter description here'}),
}
347
看看这个小部件的文档。基本上,它的样子会是这样的:
q = forms.CharField(label='search',
widget=forms.TextInput(attrs={'placeholder': 'Search'}))
写的内容会多一些,但这样分开可以更好地处理一些复杂的情况。
你还可以在你的ModelForm
子类的Meta
里面直接声明一个widgets
属性,里面包含<字段名称> => <小部件实例>
的映射关系。