【发布时间】:2015-03-05 14:56:09
【问题描述】:
我正在制作一个基本上基于表单的 Flask 应用程序,因此我使用的是 WTForms 和 Flask-wtf。
我目前正在重构我的代码,因此我的整个表单都使用了 WTForms,并且我无法使用 WTForms 实现其中一种表单的动态部分。我不知道该怎么做,我最初的想法没有奏效,我找不到涵盖我的问题的参考资料或教程,所以这就是我寻求帮助的原因。
因此,有问题的表单允许用户提交包含以下内容的对象:
- 标签(StringField,简单)
- 描述(TextAreaField,也很简单;虽然我很难使默认值起作用)
- 表单的属性列表(谓词、对象),其中谓词取自预先构建的列表,对象基本上可以是任何东西,但每个谓词都会生成一个特定对象(例如,谓词“相关”将期望另一个对象(来自下拉列表),谓词“资源”将期望某种 http 链接)。此列表可以为空。
你可以猜到我的列表有问题。代码现在的工作方式,我使用 wtforms 获取标签和描述,并使用配置常量生成属性列表(在整个代码中使用,所以如果我想添加新属性,我只有一个地方可以编辑)以及创建(此处为谓词)字段的 javascript 中的动态菜单,然后我可以在视图函数中使用 flask.request.form 对象来获取这些字段。谓词的所有隐藏字段都具有相同的名称属性,对象的所有隐藏字段都具有相同的名称属性。
下面是表单视图的样子,用一些属性初始化:
http://i.imgur.com/bfMG95s.png
在“Propriétés”标签下,您有一个用于选择谓词的下拉菜单,第二个字段根据所选谓词显示或隐藏(可以是下拉菜单或文本字段),只有当您单击“ Ajouter propriété”(“添加属性”),即在下面的选项卡中添加新行并生成字段。
我不想在这方面进行任何更改,因为它运行良好,使表单非常直观,并且基本上正是我想要的用户端。
这就是我的自定义表单现在的样子(无论我随表单提交的字段数量如何,它都不起作用并且属性保持为空):
class PropertyForm(Form):
property_predicate = HiddenField(
validators=[AnyOf(values=app.config["PROPERTY_LIST"].keys())]
)
property_object = HiddenField(
validators=[DataRequired()]
)
class CategoryForm(Form):
"""
Custom form class for creating a category with the absolute minimal
attributes (label and description)
"""
label = StringField(
"Nom de la categorie (obligatoire)",
validators=[DataRequired()]
)
description = TextAreaField(
"Description de la categorie (obligatoire)",
validators=[DataRequired()]
)
properties = FieldList(FormField(PropertyForm),validators=[Optional()])
这是我希望在我的 views.py 代码中做的事情(我目前正在重构):
def cat_editor():
cat_form = CategoryForm()
if request.method == "GET":
# Do GET stuff and display the form
return render_template("cateditor.html", form=cat_form, varlist=template_var_list)
else if request.method == "POST":
if cat_form.validate_on_submit():
# Get values from form
category_label = cat_form.label.data
category_description = cat_form.description.data
category_properties = cat_form.properties.data
# Do POST stuff and compute things
return redirect(url_for("index"))
else:
# form didn't validate so we return the form so the template can display the errors
return render_template("cateditor.html", form=cat_form,
template_var_list = template_var_list)
基本结构完美运行,只是我无法正常工作的那个该死的动态列表。
从 WTForms CategoryForm 实例获取标签和描述工作正常,但属性总是返回一个空列表。理想情况下,我希望能够在调用 cat_form.properties.data 时获得表单 [(predicate1, property1), (predicate2, object2) ... ] 的列表(这就是为什么我有一个包含两个 FormFields 的 FieldList每个中都有 HiddenField),但只要使用 WTForms,我就不必从两个列表中构建这样的列表。任何想法?非常感谢:)
【问题讨论】:
标签: python dynamic flask wtforms