python - Django:在 init 中访问 form_kwargs

标签 python django

我定义了 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等等在函数签名中,因此您可以将它们访问为 organizerevent .

如果您不将它们包含在函数签名中,那么您将能够从 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来自kwargsBaseReserveFormSet ,

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/

相关文章:

django - 如何将属性 '_meta' 添加到对象?

python - 如何在seaborn中自定义热图的颜色条?

python - 当前导数字为零时,在 python 中添加数字的递归函数失败

python - Overpass 查询适用于 overpass-turbo.eu,但不适用于本地

django - 使用 Django 和 Elastic beanstalk 实现并行任务的最佳方式是什么?

javascript - 如何将 <td> 限制为只有三行?

python - python 中搜索字符串的函数

python - 我的歌词机器人不向服务器发送字符串

javascript - 单击按钮时 Ajax 从 Django 1.9 代码中获取新值

python - 在 django Rest 框架中返回 Respose 对象时出现 NoReverseMatch 错误