2016-09-27 7 views
0

저는 파이썬 2.7, Django 1.9.4를 Ubuntu 14.04에서 사용하고 있습니다.__init__에 매개 변수가있는 ModelForms가있는 폼 마법사

저는 며칠 동안 django-formtools (특히 폼 마법사)를 사용하여 고심하고 있습니다. 다음과 같은 시나리오는 다음과 같습니다

  1. 1 단계 :

    양식 마법사는 단지 2 단계 프로세스 나는 모델을 기반으로 ModelForm 있습니다. 양식 __init()__에는 매개 변수 (정수로 로그인 한 사용자의 ID)가 필요합니다.

  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()을 덮어. InformationAddPublisherForm이 만들어지는 모델 클래스입니다.

views.py 나는 파이어 폭스에서 URL을 호출 할 때

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) 

그러나, 실행시, I 오류 __init__() takes at least 2 arguments (1 given)을 얻고있다. 내 forms.py에서 __init__()을 제거하면 코드가 올바르게 실행됩니다.

그리고 django-formtools에서이 ModelForm을 어떻게 만들 수 있는지에 대한 아이디어가 통합되었습니다.

일부 관련 게시물 : 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