Как добавить заполнитель на CharField в Django?
возьмите эту очень простую форму, например.
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')
что было бы лучшим способом для достижения это?
5 ответов
посмотреть виджеты документации. В основном это будет выглядеть так:
q = forms.CharField(label='search',
widget=forms.TextInput(attrs={'placeholder': 'Search'}))
больше письма, да, но разделение позволяет лучше абстрагироваться от более сложных случаев.
вы также можете объявить
для модели вы можете использовать мета-класс таким образом:
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'}),
}
все остальные методы хороши. Однако, если вы предпочитаете не указывать поле (например, для некоторого динамического метода), вы можете использовать это:
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 с указанным экземпляром.
этот код можно использовать для добавления заполнителя attr для каждого поля TextInput в форме. Текст для заполнителей будет взят из меток полей модели.
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
большой вопрос. Есть три решения, о которых я знаю:
Решение № 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
наконец, если вы работа с модельной формой тогда (в дополнение к предыдущим двум решениям) у вас есть возможность указать пользовательский виджет для поля путем установки внутренней Meta
класса.
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
widgets = {
'body': forms.Textarea(attrs={'cols': 80, 'rows': 20})
}