Используйте метку поля в качестве заполнителя в django-crispy-forms
Я думаю о сухом способе использования меток полей для атрибута заполнителя my <input>
HTML-элементов. Я использую django-crispy-forms
.
сейчас у меня есть:
class FilterForm(Form):
query = CharField(max_length=50, label='', required=False)
def __init__(self, data=None, files=None, **kwargs):
self.helper = FormHelper()
self.helper.layout = Layout(
Field('query', placeholder='Search ...'),
)
super(FilterForm, self).__init__(data, files, **kwargs)
Я бы предпочел, однако, не устанавливать метку и заполнитель отдельно, так как это в конечном итоге будет иметь гораздо больше полей, и это довольно многословно.
какие ваши предложения?
7 ответов
сухой раствор может быть достигнут с помощью этого _ _ init__ способ:
def __init__(self, *args, **kwargs): super(FilterForm, self).__init__(*args, **kwargs) helper = self.helper = FormHelper() # Moving field labels into placeholders layout = helper.layout = Layout() for field_name, field in self.fields.items(): layout.append(Field(field_name, placeholder=field.label)) helper.form_show_labels = False
в настоящее время, скрытие меток может быть достигнуто с помощью вспомогательный атрибут bootstrap ниже:
self.помощник.form_show_labels = False
по умолчанию установлено значение True. Он решает, отображать или нет метки полей формы.
вам все равно нужно определить заполнитель, используя объект макета поля:
поле ('query', placeholder= ' Search ...'),
попробуйте это:
class FilterForm(Form):
query = CharField(max_length=50, label='', required=False)
def __init__(self, data=None, files=None, **kwargs):
self.helper = FormHelper()
self.helper.layout = Layout(
Field('query', placeholder=kwargs.pop('query_placeholder', 'random text')),
)
super(FilterForm, self).__init__(data, files, **kwargs)
вы можете добавить дополнительные атрибуты в поля формы, используя:
query = CharField(widget=forms.TextInput(attrs={'placeholder':'Search..'}),
max_length=50, label='', required=False)
это сухое решение не требует модификации макета. Я предлагаю сделать это примесь:
class MyForm(Form):
_placeholders = {
'fieldname': 'fieldname placeholder',
}
def __init__(self, *args, **kwargs):
# Assign placeholder to widget of fields
# listed in self._placeholders.
for field_name, field in self.fields.items():
if field_name in self._placeholders:
self.fields[field_name].widget.attrs['placeholder'] = \
self._placeholders[field_name]
super(MyForm, self).__init__(*args, **kwargs)
есть поле виджетов, если вы хотите больше контроля
class PostForm(forms.ModelForm):
class Meta:
model = Post
widgets = {
'comment': forms.Textarea(attrs={'rows': 6, 'placeholder': 'Enter your comments'}),
}
labels = {
"private": "Keep Private",
}
exclude = ['response', 'display']
Я закончил тем, что просто скрывал метки полей с помощью css. Это немного банально, но работает. Однако я все еще использовал placeholder="your label" для определения заполнителей.