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

Добавить класс css в поле в wtform

Я создаю динамическую форму, используя wtforms (и флягу). Я хотел бы добавить некоторые пользовательские классы css в поля, которые я создаю, но до сих пор я не мог этого сделать. Используя ответ, который я нашел здесь, я попытался использовать собственный виджет, чтобы добавить эту функциональность. Он реализуется почти так же, как и ответ на этот вопрос:

class ClassedWidgetMixin(object):
  """Adds the field name as a class.

  (when subclassed with any WTForms Field type).
  """

  def __init__(self, *args, **kwargs):
    print 'got to classed widget'
    super(ClassedWidgetMixin, self).__init__(*args, **kwargs)

  def __call__(self, field, **kwargs):
    print 'got to call'
    c = kwargs.pop('class', '') or kwargs.pop('class_', '')
    # kwargs['class'] = u'%s %s' % (field.name, c)
    kwargs['class'] = u'%s %s' % ('testclass', c)
    return super(ClassedWidgetMixin, self).__call__(field, **kwargs)


class ClassedTextField(TextField, ClassedWidgetMixin):
  print 'got to classed text field'

В представлении я делаю это для создания поля (ClassedTextField импортируется из форм, а f является экземпляром базовой формы):

  f.test_field = forms.ClassedTextField('Test Name')

Остальная часть формы создается правильно, но этот jinja:

{{f.test_field}}

производит этот вывод (без класса):

<input id="test_field" name="test_field" type="text" value="">

Любые советы будут замечательными, спасибо.

4b9b3361

Ответ 1

Вам действительно не нужно идти на уровень виджета, чтобы привязать атрибут класса HTML к рендерингу поля. Вы можете просто указать его с помощью параметра class_ в шаблоне jinja.

например.

    {{ form.email(class_="form-control") }}

приведет к следующему HTML::

    <input class="form-control" id="email" name="email" type="text" value="">

чтобы сделать это динамически, скажем, используя имя формы как значение атрибута класса HTML, вы можете сделать следующее:

Дзиндзя:

    {{ form.email(class_="form-style-"+form.email.name) }}

Вывод:

    <input class="form-style-email" id="email" name="email" type="text" value="">

Дополнительные сведения о вводе атрибутов HTML см. в официальной документации .

Ответ 2

Если вы хотите программно включить класс css (или, действительно, любые другие атрибуты) в поле формы, вы можете использовать аргумент render_kw.

например:

r_field = RadioField(
    'Label', 
    choices=[(1,'Enabled'),(0,'Disabled')], 
    render_kw={'class':'myclass','style':'font-size:150%'}
)

будет отображаться как:

<ul class="myclass" id="r_field" style="font-size:150%">
    <li><input id="r_field-0" name="r_field" type="radio" value="1"> <label for="r_field-0">Enabled</label></li>
    <li><input id="r_field-1" name="r_field" type="radio" value="0"> <label for="r_field-1">Disabled</label></li>
</ul>

Ответ 3

В WTForms 2.1 я использовал extra_classes, как показано ниже:

1. Первый путь

{{ f.render_form_field(form.email, extra_classes='ourClasses') }}

Мы также можем использовать ответы @John Go-Soco, чтобы использовать атрибут render_kw в нашем поле формы, например, таким образом.

2. Второй способ

style={'class': 'ourClasses', 'style': 'width:50%;'}
email = EmailField('Email', 
                   validators=[InputRequired(), Length(1, 64), Email()],
                   render_kw=style)

Но я бы больше хотел использовать первый способ.