【问题标题】:Multi-part form using Flask / WTForms使用 Flask / WTForms 的多部分表单
【发布时间】:2016-02-19 13:32:26
【问题描述】:

我有一个多部分的表单要生成 - 考虑类似于购物车的工作流程,其中您有多个“部分”(例如详细信息、帐单、付款等),一次显示一个表单。

关键细节:

  • 表单有 3 个部分
  • 这些部分必须按顺序完成,第 2 部分依赖于第 1 部分的信息
  • 除非此人完成完整流程(第 1、2 和 3 节),否则表单数据是无用的(例如将被丢弃)。

我考虑过的方法:

  • 使用一个路由def 并在request.args 中存储一个值,告诉我我在哪个“部分”然后render_template 根据部分不同的表单模板。这感觉很老套……
  • 每个部分都有不同的路线和视图。这感觉不对,我必须阻止人们通过 URL 直接进入第 2 步
  • 将所有部分放在一个表单上,使用 Javascript 隐藏一个表单的各个部分并以这种方式在各个部分之间移动

在 Flask/WTForms 中完成此任务的最佳方法是什么?我上面发布的所有方法似乎都不正确,我毫不怀疑这是一个相当普遍的要求。

【问题讨论】:

  • 就个人而言,我认为这是一个使用 jinja 模板的好情况,但我不是专家,所以我不能说它是最好的,甚至是正确的。如果你在第 1 节中获得所需的数据,则显示第 2 节,如果你在第 2 节中获得数据,等等。这种仅使用 Flask-Wtforms 的方法需要一个提交按钮。除非您想添加 Javascript 事件。我很想知道什么对你有用。
  • @skywalker 如何通过 Jinja 实现?模板不是只被点击一次然后渲染吗?所以递归渲染也需要一个按钮,不是吗?
  • 您使用的表格是什么?这可能取决于您的表单是什么,但您可以从 Python 端的表单中检测数据,并将其传递到 Jinja 模板,然后可以有条件地显示表单的某些部分。是的,这种方法需要提交按钮。除非例如,您正在使用选择多个字段,您可以通过 JavaScript 检测到状态的变化。

标签: python flask wtforms flask-wtforms


【解决方案1】:

正如您在上一个想法中提到的,最优雅的解决方案无疑需要一些 javascript。您可以使用 JS 隐藏表单的不同部分,并在客户端执行必要的检查和/或数据操作,并且仅在正确并完成将其提交到您的烧瓶路由时。

我使用了你提到的第一种方法。这是它的样子:

@simple_blueprint.route('/give', methods=['GET', 'POST'])
@simple_blueprint.route('/give/step/<int:step>', methods=['GET', 'POST'])
@login_required
def give(step=0):
    form = GiveForm()
    ...
    return blah blah

你说得对,这感觉很“骇人听闻”。但是,如果路线除了处理表格之外不需要做太多其他事情,它就可以工作。我的路线的工作方式是收集数据,然后向用户询问有关数据的一堆问题。你解释你的情况的方式,需要收集每一步的数据,我真的推荐javascript解决方案。

【讨论】:

  • 谢谢!只是想确保没有“更好的方法”。因为我想要一些服务器端验证,所以我选择了第一个选项(在每个部分之后点击服务器),但可能会通过对服务器的 JS 调用将其迁移到 JS 以验证我何时有时间重构。
猜你喜欢
  • 2016-04-16
  • 2020-01-18
  • 2013-08-19
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2013-08-13
相关资源
最近更新 更多