请告诉我如何将css类分配给选项值。我想用小图片来改变每个选择的背景,那么如何使用wtform和css来实现呢?
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')])发布于 2014-05-01 00:40:03
如果在WTForms的内部深入观察,就会发现一个名为SelectField的小部件类
这是一个名为build字符串的方法:
@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方法。
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方法仅用val、selected和label参数调用。
您可以在事实之后访问隐式Option实例。这不是没有问题的。如果你看一下@Johnston的例子:
>>> 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文件中。
发布于 2014-05-06 18:53:37
我只想让你知道,这是可能的,不需要猴子修补或重写wtform。库代码确实支持它,尽管不是很直截了当。我发现这一点是因为我和你有同样的问题,我试图为WTForms编写一个修复程序,并亲自提交了一个PR,然后发现您可以这样做(我花了好几天的时间试图解决这个问题):
>>> 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://stackoverflow.com/questions/23023788
复制相似问题