我定义了 form_kwargs
,并且可以直接在 forms.py 的 __init__
中访问它们。我期望做 organizer = kwargs.pop('organizer')
等。谁能解释一下为什么我可以直接访问这些 kwargs,即使它们应该存储在 form_kwargs
中>?
我目前正在尝试将此行为复制到我的 class BaseReserveFormSet(BaseFormSet):
,但如果没有 kwargs.pop
,我就无法访问它们
@cached_property
def formset(self):
ReserveFormSet = formset_factory(
ReserveForm,
formset=BaseReserveFormSet,
extra=0
)
return ReserveFormSet(
data=(
self.request.POST
if self.request.method == 'POST'
else None
),
initial=self.tickets,
form_kwargs={
'organizer': self.request.organizer,
'event': self.request.event,
'user_order_reference': self.request.session.get('order_reference'),
'discount_code_session': self.discount_code,
}
)
forms.py
class BaseReserveFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
self.discount_code_session = kwargs['form_kwargs']['discount_code_session']
self.event = kwargs['form_kwargs']['event']
# print(kwargs.pop('discount_code_session')) # Why does this not work?
super().__init__(*args, **kwargs)
class ReserveForm(forms.ModelForm):
class Meta:
model = ReservedItem
fields = ['ticket', 'quantity']
def __init__(self, organizer, event, user_order_reference,
discount_code_session, *args, **kwargs):
self.organizer = organizer
self.event = event
[...]
最佳答案
def __init__(self, organizer, event, user_order_reference,
discount_code_session, *args, **kwargs):
self.organizer = organizer
self.event = event
您有organizer
, event
等等在函数签名中,因此您可以将它们访问为 organizer
和event
.
如果您不将它们包含在函数签名中,那么您将能够从 kwargs 访问它们。
def __init__(self, *args, **kwargs):
self.organizer = kwargs.pop('organizer')
self.event = kwargs.pop('event')
在您的 BaseReserveFormSet
中, kwargs.pop('discount_code_session')
不起作用,因为您没有通过 discount_code_session
对于表单集,您将其包含在 form_kwargs
中字典。
如果你想能够弹出 discount_code_session
来自kwargs
在BaseReserveFormSet
,
class BaseReserveFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
self.discount_code_session = kwargs['form_kwargs']['discount_code_session']
self.event = kwargs['form_kwargs']['event']
self.discount_code_session = kwargs.pop('discount_code_session'))
super().__init__(*args, **kwargs)
然后你会在你的 View 中将它作为一个单独的 kwarg 传递。请注意,表单集将不再将其传递给表单,因为它不再位于 form_kwargs
中。 .
return ReserveFormSet(
data=(
self.request.POST
if self.request.method == 'POST'
else None
),
initial=self.tickets,
form_kwargs={
'organizer': self.request.organizer,
'event': self.request.event,
'user_order_reference': self.request.session.get('order_reference'),
},
discount_code_session=self.discount_code,
)
关于python - Django:在 init 中访问 form_kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414300/