将数据从Views.py传递到Forms.py

时间:2018-01-11 03:00:33

标签: python django forms args kwargs

我正在尝试将数据从views.py移动到我的forms.py页面。我正在使用FormWizard,但我认为这不重要。

views.py

def get_context_data(self, form, **kwargs):
    context = super(CheckoutWizard, self).get_context_data(form=form, **kwargs)
    kwargs = super(CheckoutWizard, self).get_form_kwargs()

    def get_form_kwargs(self):
        kwargs = super(CheckoutWizard, self).get_form_kwargs()
        kwargs.update({'first_name': 'james'})
        kwargs.update({'last_name': 'bond'})
        form = CreditCardForm(kwargs)
        return kwargs

forms.py - 在CreditCardForm

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

    for a in args:
        for key in a:
            print("key: %s , value: %s" % (key, a[key]))

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

在上面的表单文件中,我使用嵌套循环访问* args中的数据,因为如果我调用args而没有*我得到这个

({'first_name': 'james', 'last_name': 'james'},)

我相信它是一个带有字典的元组。

我见过其他人正在使用** kwargs的其他解决方案。我目前的解决方案感觉有点hacky所以,如果有更正确或更简单的方式,这个id欣赏帮助。我也很奇怪,我在视图中添加了kwargs,但随后在args中访问了这些数据。任何关于差异的解释也将受到赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

def get_form_kwargs(self):
    kwargs = super(CheckoutWizard, self).get_form_kwargs()
    kwargs.update({'first_name': 'james'})
    kwargs.update({'last_name': 'bond'})
    # this will be called by cvb like form_class(**self.get_form_kwargs())
    # because you miss ** so you get your kwargs in arg
    # form = CreditCardForm(**kwargs)
    return kwargs


def __init__(self, *args, **kwargs):
    first_name = kwargs.pop('first_name')
    last_name= kwargs.pop('last_name')
    super(CreditCardForm, self).__init__(*args, **kwargs)