1

DjangoFormWizardを使用して既存のオブジェクトを編集しようとしています。このブログ投稿で説明されている手法に従っていますが、機能しません。これが私の編集ビューです:

@login_required
def edit_wizard(request, id):
    thing = get_object_or_404(Thing, pk=id)
    if thing.user != request.user:
        raise HttpResponseForbidden()
    else:
        initial = {0: {'year': thing.year,
                       'make': thing.make,
                       'series': thing.series,
                        ....etc.
                       },
                   1: {'condition': thing.condition,
                        ....etc.
                       },
                   }

     form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial_dict=initial)
     return form(context=RequestContext(request), request=request)

ユーザーがオブジェクトを編集できるように、ウィザードに初期データを提供する方法を理解するのを手伝ってもらえますか?あなたのアイデアをありがとう!


編集:(2/18/13)

取得していた:

TypeError at /edit/10/   __init__() takes exactly 1 argument (3 given)

これは以下の@sneawoの回答によって解決されましたが、それでも初期データは渡されず、ウィザードは代わりに新しいオブジェクトを作成します。


編集:(2/19/13)

class CreateWizard(SessionWizardView):
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
    def done(self, form_list, **kwargs):
        instance = Thing()
        for form in form_list:
            for field, value in form.cleaned_data.iteritems():
                setattr(instance, field, value)
        instance.user = self.request.user
        instance.save()
        return render_to_response('wizard-done.html', {
            'form_data': [form.cleaned_data for form in form_list],
        })
4

2 に答える 2

2

ドキュメントによると、Django 1.4+ の場合、initial_dictキーワード引数で初期データを渡します。以前のバージョン (1.3、1.3 より前にはなかったようです) では、キーワード引数はinitialでした。また、初期データ dict のステップのキーは、整数ではなく文字列にする必要があります。

initial = {'0': {'year': thing.year,
                 'make': thing.make,
                 'series': thing.series,
                  ....etc.
                },
           '1': {'condition': thing.condition,
                  ....etc.
                },
          }

UPDATE : 同じオブジェクトを更新するには、id も設定する必要があります。そうしないと、django がどのオブジェクトを更新するかを知る方法がありません。これを行う簡単な方法は、id を非表示フィールドに渡すことですが、(done) メソッドでユーザー権限チェックを再度行う必要があります。

initial = {0: {'id': thing.id,


class CreateWizard(SessionWizardView):
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
    def done(self, form_list, **kwargs):
       id = form_list[0].cleaned_data['id']
       thing = get_object_or_404(Thing, pk=id)
       if thing.user != self.request.user:
           raise HttpResponseForbidden()
       else:
         instance = Thing()
         for form in form_list:
             for field, value in form.cleaned_data.iteritems():
                 setattr(instance, field, value)
         instance.user = self.request.user
         instance.save()
         return render_to_response('wizard-done.html', {
             'form_data': [form.cleaned_data for form in form_list],})

そしてもちろん、StepOneForm には隠しフィールドを持つ id が必要です:

class StepOneForm(forms.Form):
    id = forms.IntegerField(widget=forms.HiddenInput)
于 2013-02-21T16:47:38.727 に答える
1

使ってみてform = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial=initial)

于 2013-02-19T22:56:07.440 に答える