Подтвердить что ты не робот

Wtforms, добавьте класс в форму динамически

Есть ли способ отправить класс формы (css) из python? Например:

class Company(Form):
    companyName = TextField('Company Name', [validators.Length(min=3, max = 60)])

Это создает простое текстовое поле, но я хочу, чтобы это текстовое поле имело класс css .companyName, возможно ли это непосредственно из python?

Я знаю, что я могу поставить id="companyName" непосредственно из python, но не из класса.

Справка.

Обновление: Я пробовал class_="companyName", и это не сработало, я получил:

__init__() got an unexpected keyword argument '_class'
4b9b3361

Ответ 1

WTForms не позволяет вам устанавливать параметры отображения (такие как имя класса) в инициализации поля. Однако есть несколько способов обойти это:

  • Если все ваши поля должны включать имя класса, а также идентификатор, то просто передайте в каждое поле short_name значение это когда вы его визуализируете:

    <dl>
    {% for field in form %}
    <dt>{{field.label}}</dt>
    <dd>{{field(class_=field.short_name)}}</dd>
    {% endfor %}
    </dl>
    
  • Создайте настраиваемый виджет mixin, который предоставляет имя класса:

    from wtforms.fields import StringField
    from wtforms.widgets import TextInput
    
    class ClassedWidgetMixin(object):
        """Adds the field name as a class 
        when subclassed with any WTForms Field type.
    
        Has not been tested - may not work."""
        def __init__(self, *args, **kwargs):
            super(ClassedWidgetMixin, self).__init__(*args, **kwargs)
    
        def __call__(self, field, **kwargs):
            c = kwargs.pop('class', '') or kwargs.pop('class_', '')
            kwargs['class'] = u'%s %s' % (field.short_name, c)
            return super(ClassedWidgetMixin, self).__call__(field, **kwargs)
    
    # An example
    class ClassedTextInput(ClassedWidgetMixin, TextInput):
        pass
    
    class Company(Form):
        company_name = StringField('Company Name', widget=ClassedTextInput)
    

Ответ 2

В качестве альтернативы вы можете добавить класс в свой шаблон, как это для jinja2:

{{ form.name(size=20, class_='input-small') }}

Ответ 3

Используйте render_kw, если используете WTForms >= 2.1:

submit = SubmitField(u'Block Submit Buttom', render_kw={"class": "btn btn-primary btn-block"})

Ответ 4

В шаблоне попробуйте

{{ form.companyName( **{'class': 'companyName'} ) }}