【发布时间】:2014-03-31 20:22:06
【问题描述】:
我正在使用 wtforms(和烧瓶)生成动态表单。我想在我生成的字段中添加一些自定义 css 类,但到目前为止我一直无法这样做。使用我找到的答案here,我尝试使用自定义小部件来添加此功能。它的实现方式与该问题的答案几乎完全相同:
class ClassedWidgetMixin(object):
"""Adds the field's 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="">
任何提示都会很棒,谢谢。
【问题讨论】:
-
试试updated code 看看是否有帮助:-)
-
非常感谢您的快速回复!我已经更新了我的代码,现在正在创建这样的字段:
f.test_field = forms.TextInput('Company Name', widget=forms.ClassedTextInput)。但是,不幸的是,我收到了TypeError: __init__() got an unexpected keyword argument 'widget'错误。 -
您应该使用
StringField而不是TextInput进行字段定义:-) -
请原谅我继续问我认为非常基本的问题——我现在收到了
TypeError: sequence item 7: expected string or Unicode, ClassedTextInput found。这是否意味着我需要将__call__函数的返回值转换为字符串/unicode?也许只是在调用 str()? -
您应该仅在呈现模板时指定 HTML 标记的类。最好将逻辑与数据的表示分开。出于这个原因,我建议你在模板中使用 Jinja 2 设置一个特定的类,而不是在你的烧瓶应用程序代码中。