Django表单和many2many.through字段

时间:2016-09-07 10:07:07

标签: django forms django-forms django-formwizard

我正在构建一个向导(使用Django Formtools),允许用户订购一个或多个项目,每个选定项目都可以指定所需的数量。

我希望避免使用经典的购物车系统,并使购买变得尽可能简单。我的导航建议只有3页/步骤:

  1. 第一页显示包含所有可用项目的表单。可以选择这些项目,访问者可以指定数量。
  2. 第二页汇总了订单,并要求访问者填写他们的详细信息
  3. 最后一页确认订单
  4. 我在第一步创建表单时遇到了麻烦,我正在寻找帮助,找到我尝试过的两个选项之间的中间位置。

    我的Django模型看起来像这样(演示简化):

    class Item(models.Model):                                                                                                                   
        name = models.CharField(max_length=255)
        price = models.DecimalField(max_digits=5, decimal_places=2)
    
    class Order(TransactionBase):
        items = models.ManyToManyField(Item, through='OrderedItem')
    
    class OrderedItem(models.Model):
        order = models.ForeignKey(Order)
        item = models.ForeignKey(Item)
        quantity = models.PositiveSmallIntegerField()
    

    使用以下ModelForm,我能够列出所有可用的项目:

    class OrderSelectionForm(forms.ModelForm):
        class Meta:
            model = Order                                                                                                                            
            fields = ('items',)
            widgets = {
                'items': forms.CheckboxSelectMultiple(),
            }
    

    但它不允许指定数量......

    使用以下代码,我可以创建一个表单来指定数量:

    inlineformset_factory(Order, Order.items.through)
    

    但不是显示所有可用项目的平面列表,而是显示3组带有下拉列表以选择所需项目。

    如何将这两个approches组合起来,以获得一个列出所有可用项目的表单,允许用户指定数量?

    非常感谢。

1 个答案:

答案 0 :(得分:1)

[编辑]:删除了之前的答案,因为它是复制错误。

在此阶段,您不会处理订单。您提供的目录包含提交生成订单时的产品。因此,根据项目创建表单,为复选框和数量输入提供可以链接到项目的名称(合并项目的主键),然后在提交时生成订单。