gpt4 book ai didi

python - Django 1.1 FormWizard,动态扩展表单

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:41 26 4
gpt4 key购买 nike

我正在尝试创建一个多页表单,其中第二页上的字段元素数量由第一页上给出的答案定义。

我设置了一个 formWizard,我的理解是我需要使用 process_step() 来更改下一页的设置。我可以扩展现有的表单定义以添加更多元素,或者将 2 个或多个表单定义合并在一起以生成正确数量的表单元素,但我不知道如何执行此操作。

例如

第 1 页 - 选择感兴趣的主题:

第 2 页 - 对于每个主题:提出相关问题。问题在应用程序中被定义为单独的表单,但需要显示在一页上,或合并到单个表单中。

非常感谢任何帮助。

花钱者

最佳答案

花钱者,

至少目前我不知道如何在 FormWizard 中将多个表单合并到一个页面上。在 django 1.2 中,您将能够将 FormSets 作为 FormWizards 中的步骤(按照 this ticket )包含在内,但这些仅处理相同表单的多个副本,而不是多个表单的编译。但有一种方法可以满足您的要求:

from django.contrib.formtools.wizard import FormWizard
from django import forms

class SubjectForm(forms.Form):
subjects = forms.MultipleChoiceField(choices = (('language', 'language'),
('sport','sport')))

class RelatedQForm(forms.Form):
"""Overload the __init__ operator to take a list of forms as the first input and generate the
fields that way."""
def __init__(self, interested_subjects, *args, **kwargs):
super(RelatedQForm, self).__init__(*args, **kwargs)
for sub in interested_subjects:
self.field[sub] = forms.CharField(label = "What do you think about %s" % subject)

class SubjectWizard(FormWizard):
def done(self, request, form_list):
process_form_list(form_list)

def process_step(self, request, form, step):
if step == 1:
chosen_subs = form.cleaned_data['subjects']
self.form_list[1] = RelatedQForm(chosen_subs)

使用此代码,您可以像通常在 View 中那样实例化 FormWizard,然后让向导类处理幕后的所有事务。

总体思路是重载“RelatedQForm”的 init 类以动态更改字段。此代码片段取自here 。您可以根据需要使 init 运算符中的处理变得尽可能复杂,阅读“将表单中的字段作为 if-elif block 包含在 for 循环中”...您甚至可以想出一种方法以编程方式从当前表单中删除字段,但我必须看到它们才能弄清楚。

您的“process_form_list”函数需要使用以下内容循环遍历字段:

for field, val in form.cleaned_data.items():
do_stuff

希望这能让你上路:)

关于python - Django 1.1 FormWizard,动态扩展表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1963568/

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