首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CSS类添加到WTForms SelectField中的选项中

将CSS类添加到WTForms SelectField中的选项中
EN

Stack Overflow用户
提问于 2014-04-11 22:45:00
回答 2查看 4.7K关注 0票数 4

请告诉我如何将css类分配给选项值。我想用小图片来改变每个选择的背景,那么如何使用wtform和css来实现呢?

代码语言:javascript
复制
class RegisterForm(Form):
    username = TextField('username', [validators.Length(min=3, max=50), validators.Required()])
    img_url = SelectField('avatar', 
            choices=[('static/images/avatars/1.jpg', '1'), 
                ('static/images/avatars/2.jpg', '2'),
                ('static/images/avatars/3.jpg', '3'), 
                ('static/images/avatars/4.jpg', '4'),
                ('static/images/avatars/5.jpg', '5'), 
                ('static/images/avatars/6.jpg', '6'),
                ('static/images/avatars/7.jpg', '7'), 
                ('static/images/avatars/8.jpg', '8'),
                ('static/images/avatars/9.jpg', '9'), 
                ('static/images/avatars/10.jpg','10')])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-01 00:40:03

如果在WTForms的内部深入观察,就会发现一个名为SelectField的小部件类

这是一个名为build字符串的方法:

代码语言:javascript
复制
@classmethod
def render_option(cls, value, label, selected, **kwargs):
    options = dict(kwargs, value=value)
    if selected:
        options['selected'] = True
    return HTMLString('<option %s>%s</option>' % (html_params(**options), escape(text_type(label))))

这是调用上面定义的__call__函数的render_options方法。

代码语言:javascript
复制
def __call__(self, field, **kwargs):
    kwargs.setdefault('id', field.id)
    if self.multiple:
        kwargs['multiple'] = True
    html = ['<select %s>' % html_params(name=field.name, **kwargs)]
    for val, label, selected in field.iter_choices():
        html.append(self.render_option(val, label, selected))
    html.append('</select>')
    return HTMLString(''.join(html))

只需实例化一个class属性就无法添加SelectField属性。当您这样做时,它会隐式地创建Option实例。在呈现时,这些隐式实例的render_options方法仅用valselectedlabel参数调用。

您可以在事实之后访问隐式Option实例。这不是没有问题的。如果你看一下@Johnston的例子:

代码语言:javascript
复制
>>> i = 44
>>> form = F()
>>> for subchoice in form.a:
...     print subchoice(**{'data-id': i})
...     i += 1

他就是这么做的。但是您必须在呈现时向类提供属性。调用subchoice(**{'data-id': i})实际上显示了预期的HTML。如果您要将WTForms与模板引擎集成,这将带来相当大的问题。因为类似于jinja的东西正在为您调用这些呈现函数。

如果您想要这类行为,我建议编写您自己的SelectField实现,允许您将属性传递到隐式Option实例中。这样,模板引擎就可以进行调用render的工作,并且可以将表单的定义统一在forms.py文件中。

票数 6
EN

Stack Overflow用户

发布于 2014-05-06 18:53:37

我只想让你知道,这是可能的,不需要猴子修补或重写wtform。库代码确实支持它,尽管不是很直截了当。我发现这一点是因为我和你有同样的问题,我试图为WTForms编写一个修复程序,并亲自提交了一个PR,然后发现您可以这样做(我花了好几天的时间试图解决这个问题):

代码语言:javascript
复制
>>> from wtforms import SelectField, Form
>>> class F(Form):
...    a = SelectField(choices=[('a', 'Apple'), ('b', 'Banana')])
... 
>>> i = 44
>>> form = F()
>>> for subchoice in form.a:
...     print subchoice(**{'data-id': i})
...     i += 1
... 
<option data-id="44" value="a">Apple</option>
<option data-id="45" value="b">Banana</option>

请看这里的会议:

https://github.com/wtforms/wtforms/pull/81

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23023788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档