【问题标题】:Django form wizard - redirect to first step after done based on a conditionDjango表单向导-根据条件完成后重定向到第一步
【发布时间】:2019-11-27 23:05:15
【问题描述】:

我对 Django 很陌生。这是我的问题。我有 3 步表单向导。在第三步结束时,我需要处理数据(通过调用 API)。如果调用结果为 True,我需要将用户重定向到一个页面,该页面显示来自向导所有步骤的数据(摘要)。如果结果为 False,那么我需要将用户重定向到将显示消息的页面......类似于“API 调用失败,您需要重新输入信息”并添加一个重定向用户的按钮到向导的第一步,其中包含所有先前输入的数据。

当结果为 TRUE 时,我可以在页面中显示汇总。但我不知道如何显示一个页面,该页面允许用户返回表单的第 1 步,并且之前输入的数据保持不变。

我为所有三种表单提供了一个模板。

请注意,我稍微简化了代码以使其简短。

forms.py
--------

class Step1Form(forms.Form): def init(self, *args, **kwargs): 
    super().init(*args, **kwargs) questions = 
    Question.objects.filter(object_type_id=1) 
    self = add_form_fields(self,questions) ##This is my method where I am adding fields based on some logic

class Step2Form(forms.Form): def init(self, *args, **kwargs): 
    super().init(*args, **kwargs) 
    questions = Question.objects.filter(object_type_id=10) 
    self = add_form_fields(self,questions)

class Step3Form(forms.Form): def init(self, *args, **kwargs): 
    super().init(*args, **kwargs) 
    questions = Question.objects.filter(object_type_id=20) 
    self = add_form_fields(self,questions)


views.py
--------

class MyQuestionWizard(SessionWizardView): 
    template_name = 'question.html'

    def get(self, request, *args, **kwargs):
        try:
            return self.render(self.get_form())
        except KeyError:
            return super().get(request, *args, **kwargs)


    def done(self, form_list, **kwargs):
        form_data = process_form_data(form_list)

        return render_to_response('done.html',{'form_data': form_data})

question.html (One template for all forms)
-------------------------------------------

{% extends "base.html" %}
{% load i18n %}
{% load widget_tweaks %}

{% block head %}
{{ wizard.form.media }}
{% endblock %}

{% block content %}
        <form action="" method="post" class="f1" novalidate>{% csrf_token %}
        <h3>Provide context about your data</h3>
        <p>Complete the required and optional questions below</p>
        {{ wizard.management_form }}
        {% for hidden_field in form.hidden_fields %}
                {{ hidden_field }}
        {% endfor %}
        {% for field in form.visible_fields %}
                <div class="form-group" align="left">
                {% if field.field.required %}
                    <label for="{{ field.auto_id }}" class="required">{{ field.label }}</label>
                {% else %}
                    <label for="{{ field.auto_id }}">{{ field.label }}</label>
                {% endif %}
                {% render_field field  %}
                {% if field.help_text %}
                     <label class="help-text">{{ field.help_text }}</label>
                {% endif %}
                </div>
        {% endfor %}

        <br>

        {% if wizard.steps.current == wizard.steps.last %}
            <div class="f1-buttons">
                <button name="wizard_goto_step" type="submit" class="btn btn-previous" value="{{ wizard.steps.prev }}">{% trans "Previous" %}</button>
                <button name="wizard_goto_step" type="submit" class="btn btn-submit" value="submit">{% trans "Submit" %}</button>
            </div>
        {% elif wizard.steps.prev %}
            <div class="f1-buttons">
                <button name="wizard_goto_step" type="submit" class="btn btn-previous" value="{{ wizard.steps.prev }}">{% trans "Previous" %}</button>
                <button name="wizard_goto_step" type="submit" class="btn btn-next" value="{% trans "submit" %}">{% trans "Next" %}</button>
            </div>
        {% else %}
            <div class="f1-buttons">
                <button name="wizard_goto_step" type="submit" class="btn btn-next" value="{% trans "submit" %}">{% trans "Next" %}</button>
            </div>
        {% endif %}
        <p align="center"> Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }} </p>
        </form>
{% endblock %}

urls.py
---------

from .views import MyQuestionWizard
from django.conf.urls import url, include
from .forms import Step1Form, Step2Form, Step3Form

from django.contrib import admin
urlpatterns = [
    #path('', views.introView),
    url(r'^myquestion/', MyQuestionWizard.as_view([("step1", Step1Form),
             ("step2", Step2Form),
             ("step3", Step3Form)])),
]

完成.html

这将是结果页面(不包括在向导中)。我希望显示此页面:

1) 如果处理数据的结果为 TRUE:数据的汇总视图

2) 如果处理数据的结果为 FALSE: 我想向用户显示一条消息,以更新他们的条目 并显示一个按钮,将用户重定向到向导的第一步, 之前输入的所有数据都完好无损。


I don't know how to do this.


【问题讨论】:

  • 你有模板吗?这 3 个表单是否在同一页面中?
  • 是的,我为所有 3 个表单提供了一个模板。
  • 我已经更新了帖子并添加了用于所有表单的模板
  • 为什么不在同一页面/模板中显示失败消息?这样,您将拥有表单中的数据。我会使用 AJAX。
  • 感谢您对失败消息使用相同页面/模板的建议。我不知道 AJAX。有没有办法在Django中做到这一点?

标签: python django forms wizard


【解决方案1】:

如果 API 调用是 False,您需要做的是在模板上下文中重新加载向导模板和您已验证的表单。像这样的:

class MyQuestionWizard(SessionWizardView): 
    template_name = 'question.html'

    def get(self, request, *args, **kwargs):
        try:
            return self.render(self.get_form())
        except KeyError:
            return super().get(request, *args, **kwargs)


    def done(self, form_list, **kwargs):
        form_data = process_form_data(form_list)

        # If the form is not valid
        # Your template should reload the page setting the form already filled
        return render_to_response('question.html', {
            'form_data': [form.cleaned_data for form in form_list],
        })

        # If the form is valid
        return render_to_response('done.html',{'form_data': form_data})

【讨论】:

  • 对不起,我没听懂你的问题。我用 urls.py 代码更新了帖子。这就是你要问的吗?你能澄清一下吗?我在想可能我应该这样写 done 方法: def done(self, form_list, **kwargs): form_data = process_form_data(form_list) form = DoneForm(initial={} ) 返回渲染(self.request, 'done.html', {'form':form})
  • 检查我更新的答案。您必须在填充了向导 1 数据表单的情况下重新加载视图。
  • 感谢 Hagyn 的快速回复。我试过了,我有两个问题。 1)当表单无效时,我像上面提到的那样重定向到 question.html,我得到一个没有任何表单字段的空向导。我们如何解决这个问题? 2)在重定向之前,我想告诉用户验证失败,这就是他们被重定向的原因。有可能这样做吗?或者我们可以在“question.html”中有一个标签,并且这个标签只有在向导从重定向加载时才会被激活。有可能吗?
  • 当为 question.html 调用 render_to_response 时,我检查了 form_data 是否包含所有必需的数据。但是,仍然没有显示任何内容。
  • 对此有什么帮助吗?提前致谢。
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 2016-03-20
  • 2011-04-18
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多