WTForms: nested form field, UndefinedError: 'unicode object' has no attribute 'label'
WTForms: nested form field, UndefinedError: 'unicode object' has no attribute 'label'
我的表单模型是这样定义的:
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 模板中我有:
<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 之外的所有内容都可以正常渲染。即这一行导致问题:
{{ render_field(translation.description, rows=5) }}
如果我用 title 替换 description 它工作正常(尽管它呈现 title 两次而不是 title 加上 description).
使用 描述 我得到以下错误:
{{ field.label(class="control-label") }}
UndefinedError: 'unicode object' has no attribute 'label'
在以以下内容开头的宏中:
{% macro render_field(field) %}
<div class="control-group {% if field.errors %}error{% endif %}">
{{ field.label(class="control-label") }}
我是 Python 或 WTForms 的新手。 description 字段名称有什么特别之处会导致一些问题/冲突吗?
我可以看到数据已通过网络服务正确传送到控制器。该字段的值没有任何可疑之处。
sample code待运行。它是从原始资源中提取的,所以在某些地方它是一团糟。
如果我更改它有效的字段名称:(
但这意味着我必须在 Web 服务上或在 Python 代码中的某处更改它。
谢谢。
Field
本身有 description
kwarg
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
class FacebookPostTranslationForm(Form):
description = fields.TextAreaField('Description', [validators.InputRequired()])
在模板中调用 translation.description
WTForms 返回 Field.description
而不是 FacebookPostTranslationForm.description
希望对您有所帮助:)
我的表单模型是这样定义的:
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 模板中我有:
<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 之外的所有内容都可以正常渲染。即这一行导致问题:
{{ render_field(translation.description, rows=5) }}
如果我用 title 替换 description 它工作正常(尽管它呈现 title 两次而不是 title 加上 description).
使用 描述 我得到以下错误:
{{ field.label(class="control-label") }}
UndefinedError: 'unicode object' has no attribute 'label'
在以以下内容开头的宏中:
{% macro render_field(field) %}
<div class="control-group {% if field.errors %}error{% endif %}">
{{ field.label(class="control-label") }}
我是 Python 或 WTForms 的新手。 description 字段名称有什么特别之处会导致一些问题/冲突吗?
我可以看到数据已通过网络服务正确传送到控制器。该字段的值没有任何可疑之处。
sample code待运行。它是从原始资源中提取的,所以在某些地方它是一团糟。
如果我更改它有效的字段名称:( 但这意味着我必须在 Web 服务上或在 Python 代码中的某处更改它。
谢谢。
Field
本身有 description
kwarg
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
class FacebookPostTranslationForm(Form):
description = fields.TextAreaField('Description', [validators.InputRequired()])
在模板中调用 translation.description
WTForms 返回 Field.description
而不是 FacebookPostTranslationForm.description
希望对您有所帮助:)