Wtforms, динамически добавляет класс в форму
есть ли способ отправить класс формы (css) из python? Например:
class Company(Form):
companyName = TextField('Company Name', [validators.Length(min=3, max = 60)])
это отображает простое текстовое поле, но я хочу, чтобы это текстовое поле имело класс css .companyName
, это возможно непосредственно из python?
Я знаю, что могу поставить id="companyName"
непосредственно из python, но не класса.
помочь.
обновление: Я пытался!--4--> и это не сработало, я получил:
__init__() got an unexpected keyword argument '_class'
4 ответов
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's 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)
в качестве альтернативы вы можете добавить класс в свой шаблон, как это для jinja2:
{{ form.name(size=20, class_='input-small') }}
использовать render_kw
при использовании WTForms >= 2.1 :
submit = SubmitField(u'Block Submit Buttom', render_kw={"class": "btn btn-primary btn-block"})