我的模型结构大致如此:
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的模板集?我一直在打扰如何做到这一点。有人可以指出我正确的方向吗?
答案 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 %}