0

まず、データベースから一般的にフォームを作成しています。ここに私のコードがあります:

テンプレート:

{% block wizard_form_content %}
<div id="alt-list">
    <div id="alt-list-header">
        <h4>Grids List</h4>
    </div>
    <div id="alt-list-data" class="container">
    {% for grid in data.grids %}
    <input type="checkbox" name="{{ grid.name }}" id="id_{{ grid.name }}" tabindex="{{ forloop.counter}}" size="30">{{ grid.name }}<br>
    {% endfor %}
    </div>
</div>
{% if wizard.form.errors %}
<div class="form-errors-wrapper">
    <div class="error">
    {% for error in wizard.form.non_field_errors %}
        <p>{{ error }}</p>
    {% endfor %}
    </div>
</div>
{% endif %}
<input type="hidden" name="num-grids" value="{{ data.grids|length }}" id="num-grids" />
<input type="hidden" name="user" value="{{ data.user }}" id="user" />
{% endblock wizard_form_content %}

そして、これは対応するフォームです:

class WhichGridsForm(forms.Form):
#     Override the initialize in order to dynamically add fields to the form in order to be saved,
#     the fields are saved only when the user selects 'Next Step'.
    def __init__(self, *args, **kwargs):
        super(WhichGridsForm, self).__init__(*args, **kwargs)
        if len(self.data) > 0:
            self.num_grids = self.data['num-grids']
            user_name = self.data['user']

            user1 = User.objects.filter(username=user_name)

            gridtype = Grid.GridType.USER_GRID
            templateData = ShowGridsData()
            templateData.grids = Grid.objects.filter(user=user1, grid_type=gridtype)

            for grid in templateData.grids:
                gridName = grid.name
                # Every time, alternative fields are added with the name 'alternative..', and this because django
                # always adds '1-' % (where 1 the number of the step with zero index) prefix in the name,
                # with this the names are kept always the same.
                self.fields[gridName] = forms.BooleanField(required=False)

これはステップ 2 であることに注意してください。次のコード行を使用して、ステップ 3 からこのステップ 2 のデータに到達しようとすると、次のようになります。

elif self.steps.step1 == 3:
            try:
                grids_data = self.get_cleaned_data_for_step('1')
                print grids_data

すべてのフィールドをチェックしたにもかかわらず、すべてのフィールドが「False」に見えます。

{u'Cars': False, u'grid11': False, u'deneme11': False, u'asd': False}

なぜこれが起こるのか分かりますか?

編集:

しかし、「done」メソッドでフォーム フィールドを出力すると、正しい結果が得られます。

<MultiValueDict: {u'num-grids': [u'4'], u'deneme11': [u'on'], u'Cars': [u'on'], u'composite_wizard-current_step': [u'1'], u'grid11': [u'on'], u'user': [u'muratayan'], u'asd': [u'on'], u'csrfmiddlewaretoken': [u'JYIT5gHs35ZBvk7rCITfpMIPrFleUYXF']}>
4

1 に答える 1

1

申し訳ありませんが、間違ったフィールド クラスを指定しました。モデルから選択するため、代わりMultipleChoiceFieldに である必要があります。ModelMultipleChoiceField

私の場合、このようなものが機能します:

forms.py (最初のステップのフォーム)

class FirstStepForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(FirstStepForm, self).__init__(*args, **kwargs)
        self.fields['countries'] = forms.ModelMultipleChoiceField(queryset=Country.objects.all())

ビュー.py

class MyWizard(SessionWizardView):
    def render(self, form=None, **kwargs):
        response = super(MyWizard, self).render(form, **kwargs)

        grids_data = self.get_cleaned_data_for_step('0') or {}
        print grids_data

        return response
于 2013-09-05T16:02:25.457 に答える