在ModelChoicefield中选择反向外键

时间:2016-09-20 19:45:01

标签: python django django-templates

我有一个订单,用户可以选择一个项目并选择一个数量。价格取决于订购量。例如,如果您订购< 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()})

1 个答案:

答案 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