如何在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}) }