首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WTForms:嵌套表单字段,UndefinedError:'unicode对象‘没有属性'label’

WTForms:嵌套表单字段,UndefinedError:'unicode对象‘没有属性'label’
EN

Stack Overflow用户
提问于 2015-02-13 21:26:18
回答 1查看 1.1K关注 0票数 1

我的表单模型定义如下:

代码语言:javascript
运行
复制
from com.example.cms.forms import FieldList as MyAppFieldList
from flask_wtf                 import Form
from wtforms                   import fields
from wtforms                   import validators

class FacebookPostTranslationForm(Form):
    language    = fields.StringField('Language', [validators.InputRequired(), validators.Length(min=2, max=2)])
    title       = fields.TextAreaField('Title', [validators.InputRequired()])
    description = fields.TextAreaField('Description', [validators.InputRequired()])
    linkUrl     = fields.StringField('Link', [validators.InputRequired(), validators.URL()])
    pictureUrl  = fields.StringField('Picture', [validators.InputRequired(), validators.URL()])

class FacebookPostTemplateForm(Form):
    name         = fields.StringField('Name', [validators.InputRequired()])
    title        = fields.TextAreaField('Title', [validators.InputRequired()])
    description  = fields.TextAreaField('Description', [validators.InputRequired()])
    linkUrl      = fields.StringField('Link', [validators.InputRequired(), validators.URL()])
    pictureUrl   = fields.StringField('Picture', [validators.InputRequired(), validators.URL()])
    translations = MyAppFieldList(fields.FormField(FacebookPostTranslationForm), [validators.Optional()])

class FacebookPostTemplateCreateForm(FacebookPostTemplateForm):
    pass

class FacebookPostTemplateUpdateForm(FacebookPostTemplateForm):
    pass

然后在HTML模板中我有:

代码语言:javascript
运行
复制
<span id="translationFieldsetHolder">
    {% for translation in form.translations.entries %}
        <fieldset class="translationFieldset">
            <legend>{% if translation.language.data %}{{ translation.language.data|upper }}{% else %}Add{% endif %} Translation</legend>
            {{ render_field(translation.language) }}
            {{ render_field(translation.title, rows=5) }}
            {{ render_field(translation.description, rows=5) }}
            {{ render_field(translation.linkUrl) }}
            {{ render_field(translation.pictureUrl) }}
            {{ translation.csrf_token }}            
        </fieldset>
    {% endfor %}
</span>

除了translation.description之外,一切都很好。即这一行造成问题:

代码语言:javascript
运行
复制
{{ render_field(translation.description, rows=5) }}

如果我用title代替description,它工作得很好(虽然它呈现了两次标题而不是标题加描述)。

通过描述,我得到了以下错误:

代码语言:javascript
运行
复制
{{ field.label(class="control-label") }}
UndefinedError: 'unicode object' has no attribute 'label' 

在以以下内容开头的宏中:

代码语言:javascript
运行
复制
{% macro render_field(field) %}
    <div class="control-group {% if field.errors %}error{% endif %}">
        {{ field.label(class="control-label") }}

我对Python或WTForms非常陌生。有什么特殊的描述字段名可能会导致一些问题/冲突?

我可以看到数据通过web服务正确地传递给控制器。这一领域的价值没有任何可疑之处。

要运行的样本代码。它是从原始资料中提取出来的,所以在某些地方是一团糟。

如果我更改了字段的名称,它就会起作用:(但这意味着我必须在web服务上或者在Python代码中更改它。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-14 10:40:01

Field本身就有description kwarg

代码语言:javascript
运行
复制
class Field(object):
    def __init__(self, label=None, validators=None, filters=tuple(),
                 description='', id=None, default=None, widget=None,
                 _form=None, _name=None, _prefix='', _translations=None):

您要做的是将其添加到FormField(Field)对象中,该对象中也包含description

代码语言:javascript
运行
复制
class FacebookPostTranslationForm(Form):
    description = fields.TextAreaField('Description', [validators.InputRequired()])

在模板中,调用translation.description WTForms将返回Field.description而不是FacebookPostTranslationForm.description

希望有帮助:)

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

https://stackoverflow.com/questions/28509011

复制
相关文章

相似问题

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