我正在制作一个基于表单的Flask应用程序,因此我正在使用WTForms和Flask-wtf。
目前,我正在重构代码,使我的整个表单都使用WTForms。但是,在其中一个表单中有一个非常动态的部分,我无法使用WTForms实现它。我不知道该怎么做,我的初始想法没有起作用,我找不到涵盖我的问题的参考或教程,这就是为什么我寻求帮助的原因。
因此,所讨论的表单允许用户提交由以下内容组成的对象:
- 标签(StringField,容易) - 描述(TextAreaField,也很容易;虽然我在使默认值生效方面遇到了麻烦) - 表单属性列表(谓词、对象),其中谓词来自预先构建的列表,而对象可以是任何东西,但每个谓词都将生成特定的对象(例如,谓词“相关”将期望另一个对象(来自下拉列表),而谓词“资源”将期望某种类型的http链接)。该列表可以为空。
作为你们可以猜到的,我在列表方面遇到了麻烦。目前代码的工作方式是,我使用wtforms获取标签和描述,使用配置常量(在整个代码中都使用)和javascript中的动态菜单生成属性列表(这里是谓词),然后我可以在视图函数中使用flask.request.form对象获取这些字段。所有谓词的隐藏字段具有相同的name属性,所有对象的隐藏字段也具有相同的name属性。
这是表单视图的样子,初始化了一些属性:
我希望不需要在此方面进行任何更改,因为它运行良好,使表单非常直观,并且基本上完全符合我从用户端想要的内容。
这就是我的自定义表单现在的样子(它不起作用,无论我提交多少个字段,属性都为空):
基本结构运作良好,只是该死的动态列表我无法正常工作。
从WTForms CategoryForm实例获取标签和描述很好,但属性总是返回一个空列表。理想情况下,我希望能够在调用cat_form.properties.data时获得形式为[(predicate1, property1), (predicate2, object2) ...]的列表(这就是为什么我有一个每个HiddenField中有两个FormField的FieldList),但如果使用WTForms来构建这样的列表,我不会有任何问题。有什么建议吗?非常感谢 :)
目前,我正在重构代码,使我的整个表单都使用WTForms。但是,在其中一个表单中有一个非常动态的部分,我无法使用WTForms实现它。我不知道该怎么做,我的初始想法没有起作用,我找不到涵盖我的问题的参考或教程,这就是为什么我寻求帮助的原因。
因此,所讨论的表单允许用户提交由以下内容组成的对象:
- 标签(StringField,容易) - 描述(TextAreaField,也很容易;虽然我在使默认值生效方面遇到了麻烦) - 表单属性列表(谓词、对象),其中谓词来自预先构建的列表,而对象可以是任何东西,但每个谓词都将生成特定的对象(例如,谓词“相关”将期望另一个对象(来自下拉列表),而谓词“资源”将期望某种类型的http链接)。该列表可以为空。
作为你们可以猜到的,我在列表方面遇到了麻烦。目前代码的工作方式是,我使用wtforms获取标签和描述,使用配置常量(在整个代码中都使用)和javascript中的动态菜单生成属性列表(这里是谓词),然后我可以在视图函数中使用flask.request.form对象获取这些字段。所有谓词的隐藏字段具有相同的name属性,所有对象的隐藏字段也具有相同的name属性。
这是表单视图的样子,初始化了一些属性:
http://i.imgur.com/bfMG95s.png
在“Propriétés”标签下有一个下拉菜单,可选择谓词,第二个字段根据所选谓词的不同显示或隐藏(可以是下拉菜单或文本字段),只有当您点击“添加属性”时才会在下面的选项卡中添加新行并生成该字段。我希望不需要在此方面进行任何更改,因为它运行良好,使表单非常直观,并且基本上完全符合我从用户端想要的内容。
这就是我的自定义表单现在的样子(它不起作用,无论我提交多少个字段,属性都为空):
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) ...]的列表(这就是为什么我有一个每个HiddenField中有两个FormField的FieldList),但如果使用WTForms来构建这样的列表,我不会有任何问题。有什么建议吗?非常感谢 :)