2016-09-27 5 views
0

私は、Ubuntu 14.04でPython 2.7、Django 1.9.4を使用しています。__init__にパラメータを持つModelFormsフォームウィザード

私はかなりの数日の間、django-formtools(特にフォームウィザード)に苦労しています。次のようなシナリオは次のとおりです。

  1. 第一ステップ:

    フォームウィザードは、わずか2ステップのプロセスである私がモデルに基づくのModelFormを持っています。フォームの__init()__には、パラメータ(整数のログインユーザーのID)が必要です。

  2. 第2ステップ:ユーザーにフォームを送信するかどうかを尋ねる簡単なチェックボックス。

forms.pyのソース:

from django import forms 
from publishermanagement import models 
from localemanagement import models as locale_models 
from usermanagement import models as user_models 


class AddPublisherForm(forms.ModelForm): 
def __init__(self, user_id, *args, **kwargs): 
    super(AddPublisherForm, self).__init__(*args, **kwargs) 
    permitted_locale_ids = (
     user_models 
     .PublisherPermission 
     .objects 
     .filter(user=user_id) 
     .values_list('locale', flat=True)) 
    self.fields['locale'].queryset = (
     locale_models 
     .Locale 
     .objects 
     .filter(pk__in=permitted_locale_ids)) 

class Meta: 
    model = models.Information 
    fields = (
     'channel_type', 
     'current_deal_type', 
     'locale', 
     'name', 
     'contact_primary', 
     'contact_auxiliary', 
     'website', 
     'phone', 
     'is_active',) 


class ConfirmPublisherForm(forms.Form): 
confirmation = forms.BooleanField(
    label="Check to confirm provided publisher data") 

を私はスタックオーバーフローなど、様々なフォーラムでの提案に沿ってget_form_instance()を上書きしました。 Informationは、AddPublisherFormが作成されたモデルクラスです。

views.py

from django.shortcuts import render_to_response 
from django.contrib.auth.decorators import login_required 
from publishermanagement import models as publisher_models 
from formtools.wizard.views import SessionWizardView 

class CreatePublisherWizard(SessionWizardView): 

@login_required(login_url='/account/login/') 
def done(self, form_list, **kwargs): 
    # code for saving form data to be done here if user confirms the data 
    # else redirect to the main form. 
    return render_to_response(
     'publishermanagement/wiz.html', 
     {'form_data': [form.cleaned_data for form in form_list]}) 

def get_form_instance(self, step): 
    if step == u'0': 

     info = publisher_models.Information() 
     return info 
    # the default implementation 
    return self.instance_dict.get(step, None) 

私はFirefoxでURLを呼び出すときただし、実行時に、私はエラー__init__() takes at least 2 arguments (1 given)を取得しています。私がforms.pyから__init__()を削除すると、コードは正常に動作します。

このModelFormをdjango-formtoolsでどのように作成できるかについてのアイデアは、統合されています。

いくつかの関連記事:Access Request Object in WizardView Sublcass

答えて

0

あなたはget_form_kwargsをオーバーライドする必要があるとuser_idが含まれます。

class CreatePublisherWizard(SessionWizardView): 
    ... 
    def get_form_kwargs(self, step): 
     kwargs = super(CreatePublisherWizard, self).get_form_kwargs(step) 
     if step == u'0': 
      kwargs['user_id'] = self.request.user.id 
     return kwargs 
+1

@Alasadirありがとうございました!それは実際に働いた! :) – Blueraaga

関連する問題