2016-09-16 6 views
1

UpdateViewdiscussed hereとして使用しています。以下のクラスを拡張して、HTMLページがレンダリングされる前にいくつかのオブジェクト固有の計算を実行できるようにしたいと思います。たとえば、以下のダミーコードdo_some_calc()は2つの数値を加算し、結果は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)  

この方法でモデルを1回保存します。 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

関連する問題