gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:34:35 25 4
gpt4 key购买 nike

我已将多个表单添加到向导中,但表单状态仅在最后一步维护,并且不会执行 done()。

我创建了以下内容,主要基于 django 文档中的示例,以尝试深入了解这一点。似乎最后一步是在步骤之间移动时唯一保存状态的一步。

class OneForm( Form ):
field_one = forms.CharField(label='1', max_length=100)
field_two = forms.CharField(label='2', max_length=100)
field_three = forms.CharField(label='3', max_length=100)
class TwoForm( Form ):
field_one = forms.CharField(label='4', max_length=100)
field_two = forms.CharField(label='5', max_length=100)
field_three = forms.CharField(label='6', max_length=100)

TEST_WIZARD_FORMS = [
("one", OneForm),
("two", TwoForm),
]
TEST_TEMPLATES = {
'one': 'tour/one.html',
'two': 'tour/two.html',
}
class TestWizardView( SessionWizardView ):
form_list = TEST_WIZARD_FORMS
def done(self, form_list, **kwargs):
print('done executed')
return reverse('home')
def get_template_names(self):
return [TEST_TEMPLATES[self.steps.current]]

这适用于模板(one.html 和two.html 是相同的)

<html>
<body>
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{{ wizard.form.non_field_errors }}
{{ wizard.form.errors }}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">"first step"</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">"prev step"</button>
{% endif %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.next }}">"next step"</button>
<input type="submit" value="submit"/>
</form>
</body>
</html>

如果我在步骤 1 输入数据,继续执行步骤 2 并输入数据,然后返回步骤 1,则第一步没有保存数据,也没有显示表单错误。当我点击下一步返回步骤 2 时,步骤 2 的数据仍然存在。故意在步骤 1 中添加无效数据表明它也不会验证表单,因为向导会继续执行步骤 2 而不会显示错误。

当我提交表单时,done() 不会执行。如果只有最后一步真正成功,这是有道理的,但看到第 1 步没有错误让我感到困惑。

为什么除了最终表单之外,不维护表单数据?为什么最后一步是唯一真正验证表单数据的步骤?为什么done没有执行?

更新:看来表单验证最终正在发生,并且我确实通过在 post 函数中打印相关信息看到它成功了,但 done() 似乎仍然没有被执行。

谢谢。

最佳答案

文档中的步骤 1 找到 here就是答案。它指出以下内容。

The user visits the first page of the wizard, fills in the form and submits it.

这里的关键是“提交”。除非提交表单,否则不会保存表单验证或状态。使用 Wizard_goto_step 进行下一个/上一个/跳转不会提交表单,不会验证表单,并且不会将表单保存在 session /cookie 中(取决于您的选择)。

现在很明显,但我仍然认为这会误导表单向导的潜在最终用户。对我来说,在进入下一步时用实际提交替换 Wizard_goto_step 很容易,但是当用户在表单中输入一些数据,然后选择重新访问另一个步骤时,该步骤上的所有数据都会丢失。

感觉表单数据即使不完整也应该保存。我的目的是使用 storage.set_step_data() 函数手动保存此数据,因为无论如何,所有表单步骤都会在最终处理时重新验证。即使用户在某个步骤中填写了不正确的数据,他们仍然会被重定向到最后缺少数据的步骤。这感觉比在用户访问上一步时盲目删除用户的数据更好。

关于django - SessionWizardView 状态仅保存在最终表单上,done() 未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33623023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com