Django FormWizard动态表单
我正在尝试创建一个FormWizard,以便一次添加模型的多个实例。第二个页面是动态的,基于要添加的编号,并创建一个“序列号”字段——所有实例之间的区别因素 我可以看到向导的第一页,但第二页(动态页面)显示了以下验证错误: [u'ManagementForm数据丢失或已被篡改。“] 我所做的所有搜索都指向一个表单集问题,我没有使用它。我做错了什么 forms.pyDjango FormWizard动态表单,django,django-formwizard,Django,Django Formwizard,我正在尝试创建一个FormWizard,以便一次添加模型的多个实例。第二个页面是动态的,基于要添加的编号,并创建一个“序列号”字段——所有实例之间的区别因素 我可以看到向导的第一页,但第二页(动态页面)显示了以下验证错误: [u'ManagementForm数据丢失或已被篡改。“] 我所做的所有搜索都指向一个表单集问题,我没有使用它。我做错了什么 forms.py class CarrierWizardForm1(forms.Form): part_numbers = forms.Mod
class CarrierWizardForm1(forms.Form):
part_numbers = forms.ModelChoiceField(queryset=PartNumber.objects.all())
expiry_date = forms.DateField()
qty_at_new = forms.IntegerField()
unit_cost = forms.DecimalField(max_digits=10, min_value=0, decimal_places=3)
cost_currency = forms.ChoiceField(choices=CURRENCY_CHOICES)
class CarrierWizardForm2(forms.Form):
def __init__(self, *args, **kwargs):
qty = kwargs.pop('qty')
super(CarrierWizardForm2,self).__init__(*args,**kwargs)
for i in qty:
self.fields['serial_%s' % i] = forms.CharField(max_length=45)
CarrierWizardForm2中的defs是一个相当常见的习惯用法,作为解决这个问题的一种方法,在web上到处都有人注意到它,包括他们的URL
url.py
carrier_wizard_forms = [CarrierWizardForm1, CarrierWizardForm2]
...
url(r'^carrier/add/$', views.CarrierCreateWizard.as_view(carrier_wizard_forms)),
我的观点相对复杂,但并不离谱。注意,有些字段不在表单中-它们由上下文数据(用户、创建日期等)填充
视图.py
TEMPLATES = {"0": "inventory/carrier_wizard_form1.html",
"1": "inventory/carrier_wizard_form2.html"}
class CarrierCreateWizard(SessionWizardView):
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
''' Get the qty from form 1 to indicate how many fields
form2 needs for serial numbers
'''
def get_form_initial(self, step):
current_step = self.storage.current_step
if current_step == 'step1':
prev_data = self.storage.get_step_data('step0')
return self.initial_dict.get(step, {'qty': qty})
return self.initial_dict.get(step, {})
def done(self, form_list, **kwargs):
details = form_list[0]
list_of_serial_nos = form_list[1]
for serial_name, serial in list_of_serial_nos.cleaned_data.items():
carrier = Carrier()
carrier.part_numbers = details.cleaned_data['part_numbers']
carrier.creation_date = datetime.datetime.today()
carrier.expiry_date = details.cleaned_data['expiry_date']
carrier.qty_at_new = 1
carrier.qty_current = 1
carrier.serial = serial
carrier.unit_cost = details.cleaned_data['unit_cost']
carrier.cost_currency = details.cleaned_data['cost_currency']
carrier.user = self.request.user
carrier.save()
我的第二个模板很平淡,尽管您可以看到三次试图纠正此问题的失败尝试
库存/承运商向导\u form2.html
{% extends "base.html" %}
{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
{# Attempt 3 #}
{{ formset }}
{# Attempt 2 {{ form.management_form }}
{% for f in form %}
{{ f.as_p }}
{% endfor %}
#}
{# Attempt 1 {{ form }} #}
<input type=submit>
</form>
{% endblock %}
{%extends“base.html”%}
{%block content%}
{{wizard.steps.count}的步骤{wizard.steps.step1}
{%csrf_令牌%}
{尝试3}
{{formset}}
{#尝试2{{form.management{u form}}
{f的%形式为%}
{{f.as_p}
{%endfor%}
#}
{#尝试1{{form}}}
{%endblock%}
编辑
*根据要求,我的两个模板*
库存/承运商向导\u form1.html
{% extends "base.html" %}
{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
{{ wizard.form.as_p }}
<input type=submit>
</form>
{% endblock %}
{%extends“base.html”%}
{%block content%}
{{wizard.steps.count}的步骤{wizard.steps.step1}
{%csrf_令牌%}
{{wizard.form.as_p}
{%endblock%}
模板/库存/承运商\u向导\u form2.html
{% extends "base.html" %}
{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.form }}
{#
{{ wizard.management_form }}
{% if wizard.form.forms %}..
{{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{{ wizard.form }}.
{% endif %} #}
</table>
<input type=submit>
</form>
{% endblock %}
{%extends“base.html”%}
{%block content%}
{{wizard.steps.count}的步骤{wizard.steps.step1}
{%csrf_令牌%}
{{wizard.form}
{#
{{wizard.management_form}
{%if wizard.form.forms%}。。
{{wizard.form.management_form}
{wizard.form.forms%中窗体的%s}
{{form}}
{%endfor%}
{%else%}
{{wizard.form}。
{%endif%}}
{%endblock%}
您的模板不正确,请使用{{wizard.management\u form}}
添加与向导管理相关的内容,并使用{{wizard.form}
处理表单
从中,模板如下所示:
{% extends "base.html" %}
{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
{{ wizard.management_form }} {#add wizard management data #}
{% if wizard.form.forms %} {# if form is formset #}
{{ wizard.form.management_form }} {#formset's management data #}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{{ wizard.form }} {#for normal form #}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
{% endif %}
<input type="submit" value="{% trans "submit" %}"/>
</form>
{%extends“base.html”%}
{%block content%}
{{wizard.steps.count}的步骤{wizard.steps.step1}
{%csrf_令牌%}
{{wizard.management_form}{{#添加向导管理数据}
{%if wizard.form.forms%}{{#if form是formset}
{{wizard.form.management_form}{{#表单集的管理数据#}
{wizard.form.forms%中窗体的%s}
{{form}}
{%endfor%}
{%else%}
{{wizard.form}{#对于正规形式#}
{%endif%}
{%if wizard.steps.prev%}
{%trans“第一步”%}
{%trans“上一步”%}
{%endif%}
您的模板不正确,请使用{{wizard.management\u form}}
添加与向导管理相关的内容,并使用{{wizard.form}
处理表单
从中,模板如下所示:
{% extends "base.html" %}
{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
{{ wizard.management_form }} {#add wizard management data #}
{% if wizard.form.forms %} {# if form is formset #}
{{ wizard.form.management_form }} {#formset's management data #}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{{ wizard.form }} {#for normal form #}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
{% endif %}
<input type="submit" value="{% trans "submit" %}"/>
</form>
{%extends“base.html”%}
{%block content%}
{{wizard.steps.count}的步骤{wizard.steps.step1}
{%csrf_令牌%}
{{wizard.management_form}{{#添加向导管理数据}
{%if wizard.form.forms%}{{#if form是formset}
{{wizard.form.management_form}{{#表单集的管理数据#}
{wizard.form.forms%中窗体的%s}
{{form}}
{%endfor%}
{%else%}
{{wizard.form}{#对于正规形式#}
{%endif%}
{%if wizard.steps.prev%}
{%trans“第一步”%}
{%trans“上一步”%}
{%endif%}
感谢您的及时回复-我刚刚添加了代码(arg,直接来自文档,我错过了!),但不幸的是,我仍然收到相同的错误。@datakid,您能发布两个更新的模板吗?添加-当然我马上就看到了问题。嘎<代码>{wizard.management_form}}@datakid,问题解决了吗?在你的两个模板中,我都没有看到{{wizard.management\u form}}
,在第二个模板中,我没有发表评论。是的,对不起-我没有发布更正的模板,我在重新阅读我的编辑后立即解决了它。它现在可以正常工作。感谢您的及时回复-我刚刚添加了代码(arg,直接来自文档,我错过了!),但不幸的是,我仍然收到相同的错误。@datakid,您可以发布两个更新的模板吗?添加-当然我马上就看到了问题。嘎<代码>{wizard.management_form}}@datakid,问题解决了吗?在你的两个模板中,我都没有看到{{wizard.management\u form}}
,在第二个模板中,我没有发表评论。是的,对不起-我没有发布更正的模板,我在重新阅读我的编辑后立即解决了它。它现在正按预期运行。