TypeError: __init__() 在 Django Form & Formset 中有一个意外的关键字参数

Posted

技术标签:

【中文标题】TypeError: __init__() 在 Django Form & Formset 中有一个意外的关键字参数【英文标题】:TypeError: __init__() got an unexpected keyword argument in Django Form & Formset 【发布时间】:2018-05-04 08:47:10 【问题描述】:

在关注 "Passing custom parameters to formset forms" 上的 Django 文档时,我得到以下返回:

__init__() got an unexpected keyword argument 'choices'


File "/Users/emilepetrone/Envs/kishikoi/lib/python3.6/site-packages/django/utils/functional.py" in __get__
  35.         res = instance.__dict__[self.name] = self.func(instance)

File "/Users/emilepetrone/Envs/kishikoi/lib/python3.6/site-packages/django/forms/formsets.py" in forms
  144.                  for i in range(self.total_form_count())]

File "/Users/emilepetrone/Envs/kishikoi/lib/python3.6/site-packages/django/forms/formsets.py" in <listcomp>
  144.                  for i in range(self.total_form_count())]

File "/Users/emilepetrone/Envs/kishikoi/lib/python3.6/site-packages/django/forms/formsets.py" in _construct_form
  182.         form = self.form(**defaults)

File "/Users/emilepetrone/Sites/kishikoi/kishikoi/transactions/forms.py" in __init__
  119.         super(SoldTransactionForm, self).__init__(*args, **kwargs)

Exception Type: TypeError at /transactions/create/sell/transactions/31tmhqsplg41jc8c/
Exception Value: __init__() got an unexpected keyword argument 'choices'

这是我的观点,我遵循文档并在表单集 form_kwargs 中传递“选择”。

class SellTransactionsView(LoginRequiredMixin, SetHeadlineMixin, UpdateView):
    model = Transaction
    template_name = "transactions/soldtransaction_form.html"
    headline = "Sell Transaction"
    fields = ['num_shares']

    def get_object(self):
        return Transaction.objects.get(
            user=self.request.user,
            identifier=self.kwargs['identifier']
        )

    def get_choices(self):
        transaction = self.get_object()
        choices = Transaction.objects.filter(
            user=transaction.user,
        ).exclude(identifier=transaction.identifier)
        return choices

    def get_context_data(self, *args, **kwargs):
        context = super(SellTransactionsView, self).get_context_data(
            *args, **kwargs)
        choices = self.get_choices()
        formset = SoldFormset(form_kwargs='choices': choices)
        context.update(
            "formset": formset,
        )
        return context

我的表单和表单集- 我正在使用 forms.Form,因为我将使用这些字段来更新 form.is_valid() 中的不同字段。

class SoldTransactionForm(forms.Form):

    old_transaction = forms.ChoiceField()

    num_shares = forms.IntegerField(
        min_value=0
    )

    class Meta:
        fields = [
            'old_transaction',
            'num_shares',
        ]

    def __init__(self, *args, **kwargs):
        super(SoldTransactionForm, self).__init__(*args, **kwargs)
        self.fields['old_transaction'].queryset = kwargs.pop('choices')

SoldFormset = forms.formset_factory(
    SoldTransactionForm,
    formset=forms.BaseFormSet,
    extra=2
)

解决方案

对于其他遇到此问题的人,kwargs.pop('choices') 确实需要在表单中的 Super() 之上。init

这解决了错误,但随后在没有加载 ChoiceField 中的数据的情况下呈现了一个表单集。我将该字段更改为 ModelChoiceField 并设置 queryset=None(在 init 中进行更改。这解决了问题。

【问题讨论】:

【参考方案1】:

在你打电话之前先弹出super:

def __init__(self, *args, **kwargs):

        queryset = kwargs.pop('choices')

        super(SoldTransactionForm, self).__init__(*args, **kwargs)

        self.fields['old_transaction'].queryset = queryset

【讨论】:

感谢 Jens,解决了错误! +1 现在“old_transaction”字段中没有查询集数据,但这是另一个问题。再次感谢您的帮助

以上是关于TypeError: __init__() 在 Django Form & Formset 中有一个意外的关键字参数的主要内容,如果未能解决你的问题,请参考以下文章

TypeError: __init__() 得到了一个意外的关键字参数“编码”

TypeError: __init__() 在 Django Form & Formset 中有一个意外的关键字参数

TypeError: __init__() 得到了一个意外的关键字参数“评分”

Python kivy:如何修复“TypeError:object.__init__() 不带参数”?

TypeError: __init__() 接受 2 个位置参数,但给出了 4 个

TypeError: __init__() 接受 1 个位置参数,但给出了 3 个