具有参数 __init__ 的 ModelForms 的表单向导
Form wizard with ModelForms having parameters in __init__
我在 Ubuntu 14.04 上使用 python 2.7、Django 1.9.4。
我已经为 django-formtools(特别是表单向导)苦苦挣扎了好几天。场景如下:
表单向导只有两步:
- 第一步:我有一个基于模型的 ModelForm。表单的
__init()__
需要一个参数(登录用户的id是一个整数)
- 第二步:一个简单的复选框,询问 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
我在 Ubuntu 14.04 上使用 python 2.7、Django 1.9.4。
我已经为 django-formtools(特别是表单向导)苦苦挣扎了好几天。场景如下:
表单向导只有两步:
- 第一步:我有一个基于模型的 ModelForm。表单的
__init()__
需要一个参数(登录用户的id是一个整数) - 第二步:一个简单的复选框,询问 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