__init__() 在使用 get_form_kwargs 时得到了一个意外的关键字参数

Posted

技术标签:

【中文标题】__init__() 在使用 get_form_kwargs 时得到了一个意外的关键字参数【英文标题】:__init__() got an unexpected keyword argument when using get_form_kwargs 【发布时间】:2015-04-14 14:38:02 【问题描述】:

作为表单向导的一部分,我试图将一个参数从表单向导中的 get_form_kwargs 方法传递到我的表单,然后传递到模型表单集。我看过很多关于 SO 的例子(例如here、here 和 here)

代码对我来说看起来不错(初学者),但它仍然产生这个错误:

异常类型:TypeError 异常值:__init__() 有一个意外的关键字参数“父”

相关views.py提取:

def get_form_kwargs(self, step=None):
        kwargs = 
        if self.steps.current == 'assign_child':
            kwargs = super(checkout, self).get_form_kwargs(step)
            kwargs.update(
                'parent': self.request.user,
                )
            return kwargs

forms.py 提取:

class bindBookingItems(ModelForm):
    class Meta:
        model = BookingItem
        fields = ('assignedKids',)
        widgets = 
                    'assignedKids': Select(attrs='class': 'form-control',),
            
    def __init__(self, *args, **kwargs):
        parent = kwargs.pop('parent', None)
        super(bindBookingItems, self).__init__(*args, **kwargs)
        form.fields['assignedKids'].queryset = getChildren(parent.id)

checkout_bindBookingItemsFormSet = modelformset_factory(
        BookingItem, 
        form = bindBookingItems, 
        fields=('assignedKids', ),
        extra=0, max_num=5, can_delete=False)

我目前的想法是问题出在 forms.py 的某个地方。显然,由于它在抱怨它,因此该论点正在被采纳。但是,我认为我在 super 声明之前正确地弹出了 kwarg。

我做错了什么?

更新了问题,其中包含一个模型表单集。 抱歉省略此信息。完全打消了我的念头。

已更新回溯:

Traceback:
File "D:\Python27\Lib\site-packages\django\core\handlers\base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Python27\Lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "D:\Python27\Lib\site-packages\django\contrib\formtools\wizard\views.py" in dispatch
  237.         response = super(WizardView, self).dispatch(request, *args, **kwargs)
File "D:\Python27\Lib\site-packages\django\views\generic\base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "D:\Python27\Lib\site-packages\django\contrib\formtools\wizard\views.py" in get
  255.         return self.render(self.get_form())
File "D:\Python27\Lib\site-packages\django\contrib\formtools\wizard\views.py" in get_form
  419.         return form_class(**kwargs)
File "D:\Python27\Lib\site-packages\django\forms\models.py" in __init__
  558.         super(BaseModelFormSet, self).__init__(**defaults)

Exception Type: TypeError at /checkout/
Exception Value: __init__() got an unexpected keyword argument 'parent'

【问题讨论】:

根据here 的答案,init 方法不需要“父”kwargument,而是另一个,请尝试更改参数的(分配的)名称 如果您尝试将方法签名更改为 def __init__(self, parent=None, *args, **kwargs): 并直接使用 parent 而不是从 kwargs 中弹出它会发生什么? @Selcuk - 通过将方法签名修改为 def __init__(self, parent=None, *args, **kwargs) 并删除 kwargs 的弹出,我仍然遇到相同的错误 您可能正在呼叫另一个 __init__。你到底在哪里得到错误?你能发布堆栈跟踪吗? @NikosM。 - 那篇特定的文章(link 专门讨论了匹配的参数,我相信我已经在这样做了。即__init__ 方法使用与视图中传递的相同的 kwarg。我是否正确理解了您的评论? 【参考方案1】:

这是一个brilliant example,说明如何正确覆盖get_form_kwargs

我很困惑,因为我在 S.O. 中找不到血统的例子。到目前为止。

假设这种形式:

from django import forms

from .models import MyModel


class MyForm(forms.ModelForm):

    class Meta:
        model = MyModel

    def __init__(self, user_id, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

        # set the user_id as an attribute of the form
        self.user_id = user_id

现在表单已经定义好了,视图需要用用户ID注入表单:

from django.views.generic import UpdateView

# this assumes that django-braces is installed
from braces.views import LoginRequiredMixin

from .forms import MyForm
from .models import MyModel


class MyUpdateView(LoginRequiredMixin, UpdateView):
    model = MyModel
    form_class = MyForm
    success_url = "/someplace/"

    def get_form_kwargs(self):
        """This method is what injects forms with their keyword
            arguments."""
        # grab the current set of form #kwargs
        kwargs = super(MyUpdateView, self).get_form_kwargs()
        # Update the kwargs with the user_id
        kwargs['user_id'] = self.request.user.pk
        return kwargs

【讨论】:

以上是关于__init__() 在使用 get_form_kwargs 时得到了一个意外的关键字参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 __init__.py

[python][转载]__init__.py使用

即使使用 __init__.py,如何修复“尝试在非包中进行相对导入”

类的初始化__init__使用

Python之__init__函数及__init__.py

关于__init__ __main__ __name__等的使用