Django SessionWizardView 页面重新加载后跳回第一步

Posted

技术标签:

【中文标题】Django SessionWizardView 页面重新加载后跳回第一步【英文标题】:Django SessionWizardView jumps back to the first step after page is reloaded 【发布时间】:2012-09-22 12:55:10 【问题描述】:

我正在使用 SessionWizardView 管理两个表单。例如,当我在最后一步重新加载页面时,我又回到了第一步,必须再次输入所有字段。

这是预期的行为吗?如果是这样,是否有可能回到我重新加载页面之前的步骤?当然,所有字段都应相应填写。

class ManufacturingCalculatorWizard(SessionWizardView):
  def get_template_names(self):
    TEMPLATES = 
        "blueprint": "manufacturing/forms/select_blueprint.haml",
        "calculator": "manufacturing/forms/calculator.haml"
    

    return [TEMPLATES[self.steps.current]]

  def done(self, form_list, **kwargs):
    form_data = [form.cleaned_data for form in form_list]
    rcontext = RequestContext(self.request,  'data' : calculate_manufacturing_job(form_data) )
    return render_to_response('manufacturing/forms/result.haml', rcontext)

【问题讨论】:

reload的时候,你也发布数据吗? 浏览器询问我是否要重新发送表单。是的,看来我又要发送帖子数据了。 我在我的代码中看不到这种行为。您可能想发布向导视图代码、模板代码。 @Rohan 我添加了向导的代码。 我有一个怀疑。这是done 方法。我有三个步骤。第一步=表单,第二步=表单,第三步是done方法返回的结果页面。重新加载第一步和第二步有效,但重新加载结果页面出错。所以FormWizardView 本身正在工作。现在的问题是:如何重新加载结果页面并基本触发done方法? 【参考方案1】:

done 方法之后呈现的页面不是向导的一部分,因此当您重新加载它时,django 将尝试重定向到第一页作为向导的新会话。

如果您想将最后一步添加为预览和确认页面之类的内容,您可以使用虚拟表单添加新步骤并使用模板显示适当的数据。要从之前的步骤中获取数据,您可以使用get_context_data 视图方法,使用之前表单的清理数据构建上下文。

【讨论】:

以上是关于Django SessionWizardView 页面重新加载后跳回第一步的主要内容,如果未能解决你的问题,请参考以下文章

SessionWizardView 状态仅保存在最终表单中,done() 未执行

在 Django 表单中访问变量

Django 表单向导 - 将请求传递给视图?

使用 formwizard-django 创建用户后登录

将 form_list 表单实例保存到数据库的正确方法?

Django - 学习目录