簡體   English   中英

Django:如何在視圖呈現后更新 model?

[英]Django: How do I update a model after a view has been rendered?

我有一個顯示模型列表的視圖。 某些模型的某些屬性需要在視圖呈現后更新:即,用戶應該在第一次訪問時看到原始的、未更改的值,而在連續訪問時(或在頁面重新加載時)看到更新的值.

我認為我可以使用基於類的通用視圖來實現這一點。 官方文檔暗示“在調用通用視圖之前或之后做一些額外的工作”(強調我的),但所有給出的示例都會在模型顯示之前影響模型。

我查看了信號,但無濟於事。

生成一個異步任務是一種選擇,但是,因為我需要做的就是更新幾個模型中的一個字段(可能有一個或沒有)並保存它們,這對於手頭的任務來說似乎有點矯枉過正。

可以使用 ajax 請求來觸發更新,或者使用自定義模板標簽來顯示相關字段並在之后更新它們。 我不喜歡兩者,因為它們將應用程序邏輯移動到視圖層。 ajax 技術還增加了第二個請求的開銷。

然而,我似乎別無選擇,不是嗎? 是否有更實用的技術可以插入通用視圖或請求並在模板呈現后執行額外的邏輯?

這里不需要任何聰明的東西。 渲染模板不需要是視圖的結束 - 只有當您實際其作為響應返回時才會出現。 他們不必在同一個步驟中。

所以:

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 class。 您可以使用渲染后回調添加在模板實際渲染后發生的任務。

從視圖或 function 中獲取返回值,進行一些處理,然后將其踢出堆棧。

def foo(*args):
  ret = bar(*args)
  do_something()
  return ret

您能否獲取 object 的兩份副本,修改並保存一份,同時將另一份(未修改和過時)傳遞給視圖?

我還沒有使用基於類的通用視圖,所以我不能給你一個具體的例子。

Django 還帶有一個內置信號request_finished ,在 django 處理完請求后發送。

如果您的項目已經使用 celery,您可以創建一個任務來更新 model 並調用

your_task.delay() 

您可以在啟動任務之前使用倒計時參數指定經過的時間。

如果您不使用 celery,那么您將來很可能會使用:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM