2013-09-05 26 views
0

荫不理解一些不当行为在我的代码,我如何计算django表单中的复选框字段?

在这里,我定义radio和模板的形式,而不是Django的表单中check boxes

<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) 

然后我从上面的表格创建OrderItem object使用POSTDATA,

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。 我不明白为什么。我更喜欢一个详细的答案,但也是短暂的赞赏。

回答

0

您应该用常规的if来代替elif

现在,如果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 
+0

@SuziemacTani那么你可能要调试的流向你的代码中加入打印或记录语句经历。 –

+0

你是对的,使用pdb,我发现问题与命名,我要标记你的anwser是正确的,因为我认为它比我所做的更好。 –

相关问题