Django表单向导-根据第一个表单步骤选择
我使用FormWizard创建了一个两步表单,如下所示:Django表单向导-根据第一个表单步骤选择,django,dynamic,radio-button,choice,formwizard,Django,Dynamic,Radio Button,Choice,Formwizard,我使用FormWizard创建了一个两步表单,如下所示: 第一步:询问用户位置 第二步:显示多个搜索结果 根据用户位置,将其显示为单选按钮 现在,第二个表单取决于第一个表单的输入。几篇博客或stackoverflow帖子都涉及类似的主题,我按照说明进行了操作。 但是,本应在流程步骤中保存的变量在下一次初始化时不可用。 如何将变量位置从流程步骤传递到初始化? class reMapStart(forms.Form): location = forms.CharField() C
- 第一步:询问用户位置
- 第二步:显示多个搜索结果 根据用户位置,将其显示为单选按钮
class reMapStart(forms.Form):
location = forms.CharField()
CHOICES = [(x, x) for x in ("cars", "bikes")]
technology = forms.ChoiceField(choices=CHOICES)
class reMapLocationConfirmation(forms.Form):
def __init__(self, user, *args, **kwargs):
super(reMapLocationConfirmation, self).__init__(*args, **kwargs)
self.fields['locations'] = forms.ChoiceField(widget=RadioSelect(), choices=[(x, x) for x in location])
class reMapData(forms.Form):
capacity = forms.IntegerField()
class reMapWizard(FormWizard):
def process_step(self, request, form, step):
if step == 1:
self.extra_context['location'] = form.cleaned_data['location']
def done(self, request, form_list):
# Send an email or save to the database, or whatever you want with
# form parameters in form_list
return HttpResponseRedirect('/contact/thanks/')
非常感谢您的帮助
谢谢,
H
PS:POST更新了新的代码。我想你可以直接在
\uuuu init\uuuu
方法中访问POST
字典,因为它看起来像是向导通过get\u form
将POST
传递到每个表单实例中,但出于某种原因,我看不到数据
我想到的另一个选择是使用render\u模板
hook,而不是停留在这个问题上太久
class ContactWizard(FormWizard):
def done(selef, request, form_list):
return http.HttpResponse([form.cleaned_data for form in form_list])
def render_template(self, request, form, previous_fields, step, context=None):
"""
The class itself is using hidden fields to pass its state, so
manually grab the location from the hidden fields (step-fieldname)
"""
if step == 2:
locations = Location.objects.filter(location=request.POST.get('1-location'))
form.fields['locations'].choices = [(x, x) for x in locations]
return super(ContactWizard, self).render_template(request, form, previous_fields, step, context)
在Yuji的帮助下解决问题后(谢谢),工作代码是:
您可以使用存储对象从任何步骤获取数据:
self.storage.get_step_data('0')
这将返回存储后端中为该特定步骤保存的数据dict
在我下面的示例中,第一个表单包含一个“活动”下拉选择。然后,第二个表单包含一个位置选择小部件,它只显示可用于该活动的位置
当您在向导中向前或向后移动时,此选项有效-如果您按“prev”,则上述答案不起作用,因为它们仅依赖于向导向前移动(即,如果您在步骤3中按prev,则POST dict将不包含步骤0的数据!)
只是指出,请不要把我的答案作为你的答案再贴出来。您应该接受有帮助的答案,并使用代码更新编辑您的问题。
self.storage.get_step_data('0')
def get_form(self, step=None, data=None, files=None):
form = super(EnquiryWizard, self).get_form(step, data, files)
#print self['forms']['0'].cleaned_data
step = step or self.steps.current
if step == '1':
step_0_data = self.storage.get_step_data('0')
activity = Activity.objects.get(pk=step_0_data.get('0-activity'))
locations = Location.objects.filter(activities=activity)
form.fields['locations'].widget = forms.CheckboxSelectMultiple(choices=[(x.pk,x.name) for x in locations])
return form