我如何计算django形式的复选框字段?

时间:2013-09-05 12:52:01

标签: django django-forms

我没有理解我的代码中的一些不当行为,

我在此处定义模板表单中的radiocheck boxes,而不是django表单,

<form method="post" action=".">
      {% csrf_token %}
   {% for optionalitem in optionalcategory.optional_items.all %}
     <input type="radio" value="{{optionalitem.id}}" name="option">{{optionalitem.name}}
  {% endfor %}
  {%for topping in toppingcategory.topping.all %}
     <input type="checkbox" value="{{topping.id}}" name="topping">{{topping.name}}
  {% endfor%}
   ........
  </form>

表单验证,

    .....
    final_form = form(request.POST)
            if final_form.is_valid():
                order.add_to_order(request,a)
                ....
        else:
            final_form = partial_order_item_form()
        ....

我的模型使用了表单生成的帖子数据;

class OrderItem(SmartModel):
    ......
    option = models.ForeignKey(Optional_Item,null=True,blank=True)
    topping = models.ForeignKey(Topping,null=True, blank=True)

然后我使用上面表格中的postdata创建OrderItem object

def add_to_order(request,obj):  
    postdata = request.POST.copy()
    op = postdata.get('option',False)
    optional_item = None
    if op: 
        optional_item = get_object_or_404(Optional_Item, pk=op)
    toppings_checked = postdata.get('topping',None)
    toppings = None
    if toppings_checked: 
        toppings = get_object_or_404(Topping, pk=toppings_checked)
    .....
    if not item_in_orders:
        # creat and save a new order item
        anon_user = User.objects.get(id=settings.ANONYMOUS_USER_ID) 
        oi=OrderItem.objects.create(item=i,
                                          topping = toppings,
                                          option = optional_item,
                                          created_by=anon_user,
                                          modified_by=anon_user)
        oi.save()

我的问题来自于此函数,因为我尝试计算OrderItem的小计

def order_subtotal(request):        
    .....
    for order_item in order_items:
        if order_item.item.price:
            order_total += order_item.item.price * order_item.quantity
        elif order_item.option:
            order_total += order_item.option.price * order_item.quantity
        elif order_item.topping:
            order_total += order_item.topping.price * order_item.quantity
    return order_total

当我计算option的小计时,它运行得很好,但不适用于topping。 我不明白为什么。我更喜欢详细的答案,但也很喜欢简短的答案。

1 个答案:

答案 0 :(得分:0)

您应该将elif替换为常规if

现在,如果order_item有一个选项,那么你就不会看到浇头了,因为你会立即从if块中分出来!

(事实上,如果有价格,你不会看选项或配料。)

你应该这样做:

  for order_item in order_items:
    if order_item.item.price:
        order_total += order_item.item.price * order_item.quantity
    if order_item.option:
        order_total += order_item.option.price * order_item.quantity
    if order_item.topping:
        order_total += order_item.topping.price * order_item.quantity