Django FormWizard与动态形式

Kry*_*ski 6 forms django dynamic formwizard

我想实现一个简单的2部分FormWizard.表单1将动态生成如下内容:

class BuyAppleForm(forms.Form):
   creditcard = forms.ChoiceField(widget = forms.RadioSelect)
   type = forms.ChoiceField(widget = forms.RadioSelect)
   def __init__(self,*args, **kwargs):
        user = kwargs['user']
        del kwargs['user']

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

        credit_cards = get_credit_cards(user)
        self.fields['creditcard'].choices = [(card.id,str(card)) for card in credit_cards]

        apple_types= get_types_packages()
        self.fields['type'].choices = [(type.id,str(type)) for type in apple_types]
Run Code Online (Sandbox Code Playgroud)

这将动态创建一个包含可用选项列表的表单.

我的第二种形式,我实际上不想输入.我只想显示一个确认屏幕,其中包含信用卡信息,苹果信息和金额(总金额,税金,运费).用户单击"确定"后,我希望开始购买苹果.

我能够通过传入kwargs中的request.user对象来实现单一表单方式.但是,使用FormWizard,我无法弄清楚这一点.

我是否接近问题并且FormWizard不是正确的方法吗?如果是,Form __init__方法如何从HTTP请求访问用户对象?

Kry*_*ski 0

我不知道在 StackOverflow 上回答自己的问题是否是可接受的行为,这是我对自己问题的解决方案。

首先,放弃 FormWizard。

我有一种形式。两种观点:buy_applesbuy_apples_confirm

第一个视图仅处理 GET。它打印出未绑定的表单,并执行转到第二个视图的 URL 的操作。

第二个视图检查是否存在名为“confirm”的 POST 参数。如果它不存在(因为第一次加载视图时不存在),则:

  1. 将所有字段上的小部件调整为 HiddenInput
  2. 写出给出订单摘要的模板。该模板还将一个名为“confirm”的隐藏字段设置为 1(即使表单上不存在该字段)

当用户单击购买苹果时,表单将被提交回来,并且视图buy_apples_confirm将被再次调用。这次,出现了一个名为“confirm”的 POST 参数,因此我们实际上处理了购买交易,并且用户得到了他的苹果。

我欢迎对这种方法或处理这种情况的更好方法的任何批评。我是 Django 新手,发现有很多不同的方法来解决问题。但我想向最优秀的人学习。