2013-09-05 63 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是正確的,因爲我認爲它比我所做的更好。 –

相關問題