2016-09-16 4 views
1

Я использую UpdateView как discussed here. Я хотел бы расширить класс ниже, чтобы некоторые объектно-ориентированные вычисления могли быть выполнены до отображения html-страницы. Например, некоторый фиктивный код ниже, do_some_calc() добавит два номера, и результат будет сохранен в объекте/экземпляре MyModel.Добавление работы внутри UpdateView перед визуализацией шаблона

Есть ли предпочтительный подход?

models.py: 

class MyModel(models.Model): 
    A = models.FloatField(null=True) 
    B = models.FloatField(null=True) 
    C = models.FloatField(null=True) 

    def do_some_calc(self): 
     self.C = self.A + self.B 

#

views.py: 

class UpdateMyModelView(UpdateView): 
    model = MyModel 
    template_name='data_form.html' 
    fields = ['A', 'B', 'C'] 

    def get_success_url(self): 
     return self.request.POST.get('next', '/default-url/') 

ответ

2

Это спорно get_success_url ли подходящее место, чтобы сделать это. form_valid, вероятно, лучшее место для него.

def form_valid(self, form): 
    instance = form.save(commit=False) 
    instance.A = instance.B + instance.C 
    return super(UpdateMyModelView, self).form_valid(form)  

Таким образом, вы сохраняете модель только один раз. Если вы попытаетесь сделать это в get_success_url, экземпляр модели уже был сохранен в методе form_valid суперкласса.

def get_success_url(self): 
    # note self.object is the model instance 
    self.object.A = self.object.B + self.object.C 
    return self.request.POST.get('next', '/default-url/') 
+0

спасибо. Это подходит для меня. – js07920

+0

Рад помочь – e4c5

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