以这个非常简单的形式为例:
class SearchForm(Form):
q = forms.CharField(label='search')
这将在模板中呈现:
<input type="text" name="q" id="id_q" />
然而,我想在这个字段中添加一个搜索值的占位符属性,这样HTML看起来就像这样:
<input type="text" name="q" id="id_q" placeholder="Search" />
最好是我想通过字典或类似的东西在表单类中传递占位符值到CharField:
q = forms.CharField(label='search', placeholder='Search')
实现这一目标的最佳方式是什么?
好问题。我知道有三个解决方案:
解决方案1
替换默认小部件。
class SearchForm(forms.Form):
q = forms.CharField(
label='Search',
widget=forms.TextInput(attrs={'placeholder': 'Search'})
)
解决方案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'})
解决# 3
最后,如果您正在使用模型表单,那么(除了前面两个解决方案之外),您可以通过设置内部元类的widgets属性来为字段指定自定义小部件。
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
widgets = {
'body': forms.Textarea(attrs={'cols': 80, 'rows': 20})
}
大多数时候,我只是希望所有占位符都等于在模型中定义的字段的详细名称
我添加了一个mixin,可以很容易地对我创建的任何表单进行此操作,
class ProductForm(PlaceholderMixin, ModelForm):
class Meta:
model = Product
fields = ('name', 'description', 'location', 'store')
And
class PlaceholderMixin:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
field_names = [field_name for field_name, _ in self.fields.items()]
for field_name in field_names:
field = self.fields.get(field_name)
field.widget.attrs.update({'placeholder': field.label})
好问题。我知道有三个解决方案:
解决方案1
替换默认小部件。
class SearchForm(forms.Form):
q = forms.CharField(
label='Search',
widget=forms.TextInput(attrs={'placeholder': 'Search'})
)
解决方案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'})
解决# 3
最后,如果您正在使用模型表单,那么(除了前面两个解决方案之外),您可以通过设置内部元类的widgets属性来为字段指定自定义小部件。
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
widgets = {
'body': forms.Textarea(attrs={'cols': 80, 'rows': 20})
}