如何在Django的CharField中添加占位符?

以这个非常简单的forms为例。

class SearchForm(Form): q = forms.CharField(label='search') 

这将在模板中呈现:

 <input type="text" name="q" id="id_q" /> 

但是,我想添加“占位符”属性到这个字段的值“search”,以便HTML看起来像这样:

 <input type="text" name="q" id="id_q" placeholder="Search" /> 

最好我想通过一个字典或类似的东西将占位符值传递给表单类中的CharField:

 q = forms.CharField(label='search', placeholder='Search') 

什么是最好的方法来完成这个?

看看小部件的文档 。 基本上它看起来像:

 q = forms.CharField(label='search', widget=forms.TextInput(attrs={'placeholder': 'Search'})) 

更多的是写作,但分离允许更好地抽象更复杂的案例。

您也可以直接在ModelForm子类的Meta中声明一个包含<field name> => <widget instance>映射的widgets属性。

对于ModelForm,您可以使用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'}), } 

其他方法都很好。 但是,如果您不想指定字段(例如某些dynamic方法),则可以使用以下命令:

 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的实例。

您可以使用此代码为您窗体中的每个TextInput字段添加占位符attr。 占位符的文本将来自模型字段标签。

 class PlaceholderDemoForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(PlaceholderDemoForm, self).__init__(*args, **kwargs) for field_name in self.fields: field = self.fields.get(field_name) if field: if type(field.widget) in (forms.TextInput, forms.DateInput): field.widget = forms.TextInput(attrs={'placeholder': field.label}) class Meta: model = DemoModel 

伟大的问题。 我知道有三种解决scheme:

解决scheme#1

replace默认的小部件。

 class SearchForm(forms.Form): q = forms.CharField( label='Search', widget=forms.TextInput(attrs={'placeholder': 'Search'}) ) 

解决scheme#2

自定义默认的小部件。 如果您使用的是与该字段通常使用的相同的小部件,则可以简单地自定义该小部件,而不是实例化一个全新的小部件。

 class SearchForm(forms.Form): q = forms.CharField(label='Search') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['q'].widget.attrs.update({'placeholder': 'Search'}) 

解决scheme#3

最后,如果您正在使用模型表单( 除前两个解决scheme之外 ),则可以通过设置内部Meta类的widgets属性来为字段指定自定义小widgets

 class CommentForm(forms.ModelForm): class Meta: model = Comment widgets = { 'body': forms.Textarea(attrs={'cols': 80, 'rows': 20}) }