具有参数 __init__ 的 ModelForms 的表单向导

Form wizard with ModelForms having parameters in __init__

我在 Ubuntu 14.04 上使用 python 2.7、Django 1.9.4。

我已经为 django-formtools(特别是表单向导)苦苦挣扎了好几天。场景如下:

表单向导只有两步:

  1. 第一步:我有一个基于模型的 ModelForm。表单的__init()__需要一个参数(登录用户的id是一个整数)
  2. 第二步:一个简单的复选框,询问 he/she 的用户是否要提交表单。

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")

我根据包括 Stack Overflow 在内的各种论坛中的建议覆盖了 get_form_instance()Information 是创建 AddPublisherForm 所基于的模型 class。

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__() 时,代码运行正常。

以及关于如何在 django-formtools 中创建这个 ModelForm 的想法被集成。

一些相关的post:Access Request Object in WizardView Sublcass

您需要覆盖 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