Используйте метку поля в качестве заполнителя в 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" для определения заполнителей.