2013-09-05 2 views
0

Iam не в состоянии понять некоторые плохое поведение в моем коде,Как я могу вычислить поле checkbox в форме django?

Здесь я определить radio и 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

Вы должны заменить 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 
+0

@SuziemacTani Затем вы можете отлаживать, что поток код происходит через добавление печати или протоколирование заявления. –

+0

Вы правы, используя pdb, я обнаружил, что проблема связана с присвоением имен, я собираюсь отметить ваш anwser правильно, потому что я думаю, что это лучше, чем то, что я делаю. –

Смежные вопросы