1

モデルの複数のインスタンスを一度に追加する FormWizard を作成しようとしています。2 番目のページは、追加する番号に基づいて動的であり、単一の「シリアル番号」フィールド (すべてのインスタンス間の差別化要因) を作成します。

ウィザードの最初のページは正常に表示されますが、2 番目のページ (動的ページ) で次の検証エラーが発生します。

[u'ManagementForm データが見つからないか、改ざんされています。']

私が行ったすべての検索は、私が使用していないフォームセットの問題を示しています。私は何を間違えましたか?

フォーム.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)

CarrierWizardForm2の defs はかなり一般的なイディオムであり、この問題の解決策として Web 全体で注目されています。

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

私の 2 番目のテンプレートは当たり障りのないものですが、この問題を修正しようとして失敗した試みが 3 回見られます。

inventory/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 *要求に応じて、両方のテンプレート*

inventory/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 %}

templates/inventory/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 %}
4

1 に答える 1

1

テンプレートが正しくありません。{{ wizard.management_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>
于 2013-10-08T04:38:58.520 に答える