基于模型对象生成大型表单

时间:2014-07-23 18:43:02

标签: django django-forms

我的模型结构大致如此:

class Product(models.Model):
    name = models.CharField(max_length=50)
    price = models.IntegerField()

class OrderProduct(models.Model):
    product = models.ForeignKey("Product")
    amount = models.IntegerField()

class Order(models.Model):
    products = models.ManyToManyField("Product", through="OrderProduct")

我想生成一个(大)表单/表单集,列出所有产品,每个产品都有'amount'字段,使用户可以在一个页面中下订单。像这样:

| product name | price | etc | amount: [  ] |
| product name | price | etc | amount: [  ] |
[...]

[ Place order ]

所以我猜一下,基于OrderProduct的ModelForms的模板集?我一直在打扰如何做到这一点。有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

使用ModelFormSets可能有点开销,但你可以构建一堆" extra"每种产品都有内置初始值的表单,金额为0。保存后,您将只获得非零金额的实例。

在您看来:

formset_class = modelformset_factory(
                 OrderProduct,
                 widgets = {'product': forms.widgets.HiddenInput},
                 extra=Product.objects.count())
initial = [{'product': p.id, 'amount': 0} for p in Product.objects.all()]
formset = formset_class(data=request.POST or None, initial=initial)
...
if formset.is_valid():
  ordered_products = formset.save()
  # create your order here

您可以通过表单的实例属性访问模板中的产品详细信息:

{% for form in formset.forms %}
  {{ form.id }}{{ form.product }} <!-- will be hidden inputs, don't forget to add -->
  {% with product=form.instance.product %}
  {{ product.name }} | {{ product.price }} | amount: {{ form.amount }}
  {% endwith %}
{% endfor %}