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

236 投票
9 回答
167950 浏览
提问于 2025-04-16 06:35

以这个非常简单的表单为例:

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属性,里面包含<字段名称> => <小部件实例>的映射关系。

撰写回答