我有一个订单,用户可以选择一个项目并选择一个数量。价格取决于订购量。例如,如果您订购< 100,则每件商品为10美元;如果您订购100-200件商品,则为7美元。
在模板中,我想在每个选项的表单下方显示定价信息。
这些是我的模特:
class Product(models.Model):
name = models.TextField()
class Price(models.Model):
"""
This lets us define rules such as:
When ordering <100 items, the price is $10
When ordering 100-200 items, the price is $7
When ordering 200-300 items, the price is $5
etc
"""
price = models.FloatField()
min_quantity = models.PositiveIntegerField()
max_quantity = models.PositiveIntegerField()
product = models.ForeignKey(Product)
class Order(models.Model):
product = models.ForeignKey(Product, null=False, blank=False, default='')
quantity = models.IntegerField()
我可以独立地遍历表单字段和查询集:
{% for choice in form.product.field.queryset %}
<h1>{{choice}} {{choice.price_set.all}}</h1>
{% endfor %}
{% for choice in form.product %}
<h1>{{ choice.tag }} {{ choice.choice_label }}</h1>
{% endfor %}
...但我不知道如何组合循环以显示表单字段下的价格。
基本上,我想从ModelChoicefield小部件中选择反向外键。我要么需要一次遍历表单字段和查询集,要么从表单元素访问查询集中的元素。理想情况下,这是我在模板中要做的事情:
{% for choice in form.product %}
<h1>{{ choice.tag }} {{ choice.choice_label }}</h1>
{% for price in choice.price_set.all %}
<h1>{{price}} etc...</h1>
{% endfor %}
{% endfor %}
当然,我不是第一个使用此用例的人。最好的方法是什么?
修改:根据要求,这是我的表单和我的观点。回顾一下,我想我应该提到我正在使用RadioSelect
小部件。
形式:
class OrderForm(forms.ModelForm):
class Meta:
exclude = ['date_added']
widgets = {
'mailer': forms.RadioSelect
}
model = Order
查看:
def processOrder(request):
if request.method == 'POST':
orderForm = OrderForm(request.POST)
if orderForm.is_valid():
orderObject = orderForm.save()
return render(request, TEMPLATE_PREFIX + "confirm.html", {"orderObject": orderObject})
else:
return render(request, TEMPLATE_PREFIX + "register.html", { "form": orderForm })
else:
return render(request, TEMPLATE_PREFIX + "register.html", { "form": OrderForm()})
答案 0 :(得分:0)
对于具有截止日期的(非)完美主义者,这段代码虽然效率低下,但仍有效。
{% for choice in form.product %}
{% for price_candidate in form.mailer.field.queryset %}
{% if price_candidate.id == choice.choice_value|add:0 %}
<h1>{{ choice.tag }} {{ choice.choice_label }}</h1>
{% for price in price_candidate.price_set.all %}
<h1>{{price}} etc...</h1>
{% endfor %}
{% endif %}
{% endfor %}
{% endfor %}
(add:0
hack将choice_value转换为int.cf http://zurb.com/forrst/posts/Compare_string_and_integer_in_Django_templates-0Az)