[英]Django passing kwargs to inherited form causes error (generic UpdateView)
當我使用django通用視圖-UpdateView並嘗試更新表單kwargs時,如下所示:
#views.py
from .forms import SomeInheritedForm
from .models import SomeModel
from django.views.generic import UpdateView
class SomeUpdateView(UpdateView):
model = SomeModel
form_class = SomeInheritedForm
def get_form_kwargs(self, **kwargs):
kwargs = super(SomeUpdateView, self).get_form_kwargs(**kwargs)
kwargs['workspace'] = 'whatever'
return kwargs
#forms.py
from .models import SomeModel
from django import forms
class ParentForm(forms.Form):
def __init__(self, *args, **kwargs):
self.workspace = kwargs.pop('workspace', None)
super(ParentForm, self).__init__(*args, **kwargs)
class InheritedForm(forms.ModelForm, ParentForm):
class Meta:
model = SomeModel
這將產生這樣的錯誤:
Django Version: 1.7.2
Exception Type: TypeError
Exception Value:
__init__() got an unexpected keyword argument 'workspace'
Exception Location: /[ommited]/my_venv/local/lib/python2.7/site-packages/django/views/generic/edit.py in get_form, line 45
Python Executable: /[ommited]/my_venv/bin/python
Python Version: 2.7.3
但是,如果我在InheritedForm中聲明__init__
,它將正常工作。 但是,如果使用更多繼承的形式,我將不得不復制代碼,這違反了DRY原則。
Python始終嘗試通過MRO查找方法,該方法基於聲明父類的順序。 因此,在這種情況下,由於您將ModelForm
放在類定義的首位,因此ModelForm
首先在其中找到__init__
,因此會出現錯誤。
解決方案只是交換訂單:
class InheritedForm(ParentForm, forms.ModelForm):
雖然我確實想知道為什么您首先聲明了ParentForm是繼承自form.Form的-最好也使其繼承自ModelForm,所以您不需要InheritedForm中的多重繼承。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.