【问题标题】:Wtforms, add a class to a form dynamicallywtforms,动态添加类到表单
【发布时间】:2012-07-03 19:38:01
【问题描述】:

有没有办法可以从 python 发送表单的 (css) 类? 例如:

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

这会呈现一个简单的文本字段,但我希望该文本字段具有 .companyName 的 css 类,这可以直接来自 python 吗?

我知道我可以直接从 python 中输入id="companyName",但不能在类中。

帮助。

更新: 我尝试了class_="companyName",但它不起作用,我得到了:

__init__() got an unexpected keyword argument '_class'

【问题讨论】:

    标签: python css flask wtforms


    【解决方案1】:

    或者,您可以像这样在模板中为 jinja2 添加类:

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

    【讨论】:

    • 也救了我 :) 这是一个很棒的解决方案,不知道为什么 WTForm 文档中没有类似这些方面的示例
    • 如果可能的话,我会投票十次,这是一个更好的解决方案。现在我可以坐下来看看 WTForms 摇滚了~~~
    • 虽然课后的下划线似乎没有必要
    • 这个解决方案比被选为正确答案的解决方案要好得多。
    【解决方案2】:

    WTForms 不允许您在字段初始化中设置显示选项(例如类名)。但是,有几种方法可以解决这个问题:

    1. 如果您的所有字段都应包含类名和 ID,则只需在渲染时将每个字段的 short_name 传递给它:

      <dl>
      {% for field in form %}
      <dt>{{field.label}}</dt>
      <dd>{{field(class_=field.short_name)}}</dd>
      {% endfor %}
      </dl>
      
    2. 创建一个提供类名的custom widget 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)
      

    【讨论】:

      【解决方案3】:

      如果使用WTForms >= 2.1,则使用render_kw

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

      【讨论】:

      • 它适用于我很多天的年龄,但它现在失败了。我不记得我当时做了什么,但几乎就像你的回答一样。在 Ctrl+F5 之后,提交按钮也显示它 class btn btn-default:-(...任何可能的错误?WTForms==2.1Flask-WTF==0.14.2
      • 这正是我使用 parsley js 进行电子邮件验证时所需要的。
      【解决方案4】:

      在您的模板中,尝试一下

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

      【讨论】:

      • 在 Python 函数中,您不能使用“类”作为命名参数,因为它是语言关键字。例如,myfunc(class='xyz') 会导致 SyntaxError。使用上面显示的myfunc(**{'class': 'xyz'}) 可以解决这个问题。谢谢你的榜样!
      猜你喜欢
      • 2017-10-07
      • 2020-01-18
      • 2013-08-13
      • 2014-07-17
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      相关资源
      最近更新 更多