2013-10-08 5 views
1

Я пытаюсь создать FormWizard для одновременного добавления нескольких экземпляров модели. Вторая страница является динамической, основанной на количестве, которое нужно добавить, и создает одно поле «серийный номер» - фактор дифференциации между всеми экземплярами.Динамические формы Django FormWizard

Я получаю первую страницу мастера штрафа, но вторая страница - динамический один - дает мне эту Validation Ошибка:

[u'ManagementForm data is missing or has been tampered.']

Все поиски я сделал пункты к formset вопрос, который я не использую. Что я сделал не так?

forms.py

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) 

В DEFS в CarrierWizardForm2 является довольно распространенной идиомы, что отмечается по всей сети в качестве решения этой проблемы, в том числе путем Jacobian Nor их ничего с ума в URLs

urls.py

carrier_wizard_forms = [CarrierWizardForm1, CarrierWizardForm2] 
... 
url(r'^carrier/add/$', views.CarrierCreateWizard.as_view(carrier_wizard_forms)), 

Мои взгляды относительно сложны, но ничто не возмутительно. Обратите внимание, есть некоторые поля, которые не в форме - они заполняются данным контекст (пользователь, дата создания и т.д.)

views.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() 

Моим второй шаблон пресный, хотя вы можете увидеть три неудачные попытки исправить эту проблему.

инвентарь/carrier_wizard_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 %} 

EDIT * В соответствии с просьбой, оба мои шаблоны *

инвентарь/carrier_wizard_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 %} 

т emplates/инвентарь/carrier_wizard_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 %} 

ответ

1

Ваш шаблон не является правильным, используйте {{ wizard.management_form }} добавить мастер вещи, связанные с управлением и использованием {{ wizard.form }} для форм.

Из reference doc шаблон подобен:

{% 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> 
+0

Спасибо за быстрый ответ - я просто добавил код (ARG, прямо из документации, и я пропустил его!), Но, к сожалению, все еще получаю та же ошибка. – datakid

+0

@ datakid, Можете ли вы опубликовать свой * оба * обновленный шаблон? – Rohan

+0

- и, конечно же, я сразу понял проблему. Гах. '{{wizard.management_form}}' – datakid

Смежные вопросы