2016-01-24 9 views
3

Я успешно сменил конкретное поле net в моем объекте на основе количества qty со следующим кодом.Как сохранить другие данные после действия form_valid в django UpdateView?

class OrderDetailsProductEdit(UpdateView): 
    model = OrdersPlaced 
    fields = ['qty'] 
    template_name = 'backend/order-details-product-edit.html' 
    success_url = '../../../' 

    def form_valid(self, form): 
     form.instance.net = form.instance.qty * form.instance.price 
     # order = Order.objects.get(pk=self.kwargs['order_id']) 
     # subtotal = OrdersPlaced.objects.filter(order=order).aggregate(Sum('net'))['net__sum'] 
     # order.subtotal = subtotal 
     # order.save() 
     return super(OrderDetailsProductEdit, self).form_valid(form) 

Однако, я также пытаюсь изменить данные в модели ANOTHER. Если быть точным, я хочу суммировать все значения net запроса и обновить поле subtotal в другой таблице.

Обратите внимание на прокомментированные строки под номером def form_valid. У меня нет путаницы в том, что эти строки работают, но мне нужно, чтобы они исполнялись ПОСЛЕ сохранения текущей модели, поскольку они зависят от значения текущей модели.

Не найдено ошибок, кроме этого поле subtotal в модели ANOTHER ДОПОЛНИТЕЛЬНО net поле в текущей модели сохраняется. Таким образом, сумма является неправильным ответом.

Что я делаю неправильно?

+0

К сожалению, немного не ясно мне: почему разве вы не сохраните другую модель, прежде чем сохранить ее? – Wtower

+0

@Wtower, потому что данные другой модели являются результатом данных этой модели. Таким образом, другая модель будет содержать неправильные данные, если она будет сохранена в первую очередь. – MiniGunnR

ответ

5

Просто переместите команду после вызова супер

def form_valid(self, form): 
     form.instance.net = form.instance.qty * form.instance.price 
     redirect_url = super(OrderDetailsProductEdit, self).form_valid(form) 
     order = Order.objects.get(pk=self.kwargs['order_id']) 
     subtotal = OrdersPlaced.objects.filter(order=order).aggregate(Sum('net'))['net__sum'] 
     order.subtotal = subtotal 
     order.save() 
     return redirect_url 

или просто делать то, что называя super делает (за исключением модели и перенаправления success_url) самостоятельно

def form_valid(self, form): 
     form.instance.net = form.instance.qty * form.instance.price 
     self.object = form.save() 
     order = Order.objects.get(pk=self.kwargs['order_id']) 
     subtotal = OrdersPlaced.objects.filter(order=order).aggregate(Sum('net'))['net__sum'] 
     order.subtotal = subtotal 
     order.save() 
     return HttpResponseRedirect(self.get_success_url()) 
+1

Спасибо, человек! Работал как шарм. – MiniGunnR

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