5

モデルのリストを表示するビューがあります。一部のモデルの一部のプロパティは、ビューがレンダリングされた後に更新する必要があります。つまり、ユーザーは、最初のアクセス時に元の変更されていない値を表示し、後続のアクセス時(またはページのリロード時)に更新された値を表示する必要があります。 。

クラスベースのジェネリックビューでこれを達成できると思いました。公式ドキュメントは、「ジェネリックビューを呼び出す前またはにいくつかの追加作業を行う」ことを示唆しています(強調私のもの)が、与えられたすべての例は、表示される前にモデルに影響を与えます。

私は信号を調べましたが、役に立ちませんでした。

非同期タスクを生成することはオプションですが、私がする必要があるのは、いくつかのモデル(おそらく1つまたはまったくない)のフィールドを更新して保存することだけなので、手元のタスクにはやり過ぎのようです。

ajaxリクエストを使用して更新をトリガーするか、カスタムテンプレートタグを使用して関連フィールドを表示し、その後更新することができます。アプリケーションロジックをビューレイヤーに移動するので、どちらも嫌いです。ajax手法は、2番目のリクエストのオーバーヘッドも追加します。

それでも、私には他に選択肢がないようです、それとも私ですか?テンプレートがレンダリングされた後、汎用ビューまたはリクエストにプラグインして追加のロジックを実行するためのより実用的な手法はありますか?

4

5 に答える 5

8

ここでは巧妙なものは必要ありません。テンプレートのレンダリングは、ビューの最後である必要はありません。これは、実際にそれを応答として返したときにのみ発生します。それらは同じステップにある必要はありません。

そう :

def my_view(request, params):
    #...do something...
    response = render_to_response('my_template.html', {'foo': bar})
    # ...do something after rendering...
    return response

多くのビューでこれを行う必要がある場合は、デコレータで行うことをお勧めします。

def my_decorator(view):
    def my_func(request, params):
        response = view(request, params)
        #...do something after rendering...
        return response
    return my_func

これでビューを装飾でき@my_decorator、アクションはレンダリング後に実行されます。

...または、すべてのビューで実行したい場合は、ミドルウェアで実行できます (process-responseメソッドを定義するだけです)。

コメント後に編集クラスベースのジェネリック ビューは、新しい TemplateResponse クラスを使用します。レンダリング後のコールバックを使用して、テンプレートが実際にレンダリングされた後に発生するタスクを追加できます。

于 2011-05-31T22:01:33.157 に答える
0

Djangoには組み込みのシグナル も付属しており、request_finisheddjangoがリクエストの処理を終了した後に送信されます。

于 2011-05-31T23:21:33.710 に答える
0

プロジェクトですでにセロリを使用している場合は、モデルを更新して呼び出すタスクを作成できます。

your_task.delay() 

countdown 引数を使用して、タスクを起動するまでの経過時間を指定できます。

セロリを使用していない場合は、将来使用する可能性があります:)

于 2011-06-01T03:04:11.417 に答える
0

オブジェクトの 2 つのコピーを取得し、1 つを変更して保存し、もう 1 つ (変更されていない古いもの) をビューに渡しますか?

クラスベースのジェネリック ビューはまだ使用していないため、具体的な例を示すことはできません。

于 2011-05-31T21:54:20.457 に答える
0

Catch the return value from the view or function, do some processing, then kick it up the stack.

def foo(*args):
  ret = bar(*args)
  do_something()
  return ret
于 2011-05-31T21:52:58.017 に答える