__init __()在使用get_form_kwargs时获得了一个意想不到的关键字参数 [英] __init__() got an unexpected keyword argument when using get_form_kwargs
问题描述
作为表单向导的一部分,我试图将表单向导中的get_form_kwargs方法的参数传递给我的表单,然后再转到模型模型。我已经看了很多关于SO的例子(例如这里,此处和此处)
as part of a form wizard I'm trying to pass an argument from the get_form_kwargs method within form wizard to my form, and then onto a modelformset. I've looked at numerous examples on SO (e.g. here, here and here)
代码看起来对我好(初学者),但它仍然产生这个错误:
The code looks ok to me (beginner), but it's still generating this error:
异常类型:TypeError
异常值:__init __()得到一个意想不到的关键字参数'parent'
相关的views.py提取:
relevant views.py extract:
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摘录:
forms.py extract:
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的某个地方。自从抱怨以来,这个争论显然是被接受的。但是,我认为我在超级声明之前正确地弹出kwarg。
My current thinking is that the problem lies somewhere in forms.py. The argument is obviously being picked up since it's complaining about it. However, I think i'm popping the kwarg correctly before the super statement.
我做错了什么?
更新的问题是,混合中有一个模型模型。请放弃此信息。
更新为追溯:
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'
推荐答案
这是一个辉煌示例说明如何正确覆盖 get_form_kwargs
。
Here is a brilliant example illustrating how to correctly override get_form_kwargs
.
我很困惑,因为我找不到SO的下降例子到目前为止。
I was very confused since I could not find a descent example in S.O. so far.
假设这种形式:
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
现在窗体被定义,视图需要从django.views.generic导入注入用户标识的表单:
Now that the form is defined, the view needs to inject the form with the user 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时获得了一个意想不到的关键字参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!