簡體   English   中英

Django將kwargs傳遞給繼承的表單會導致錯誤(通用UpdateView)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM