2009-02-08 33 views
15

我用Django工具,我想知道是否有一種簡單的方法來創建一個「回」鏈接到上一頁使用模板系統。Django模板:創建一個「後退」鏈接?

我認爲,在最糟糕的情況下,我可以從視圖函數中的請求對象獲取這些信息,並將其傳遞給模板呈現方法,但我希望能夠以某種方式避免所有這些樣板代碼。

我檢查了Django模板文檔,我沒有看到任何明確提到這一點。

+0

當你回去時,頁面被重新渲染,這意味着任何處理(數據庫查詢,資源下載等)都會重新發生。爲了防止這種情況,請使用`@ cache_page`裝飾器。 – 2016-05-07 15:55:59

回答

12

那麼你可以啓用:

'django.core.context_processors.request', 

settings.TEMPLATE_CONTEXT_PROCESSORS塊和鉤出來的引薦,但是這是一個有點肉麻,並可能打破所有的地方。

大多數你想要這個的地方(例如SO上的編輯帖子頁)你有一個真正的對象可以連接到(在這個例子中,這個帖子),這樣你就可以很容易地找出正確的前一頁應該是什麼是。

+0

這是一個很好的信息,在閱讀本文後,我偶然發現了文檔中的「Model.get_absolute_url」。這實際上解決了我的問題,但如果您沒有指向的對象,我仍然很好奇最好的行動方案。 – 2009-02-08 02:24:09

+0

真的取決於情況。如果有一種方法可以確定哪個頁面應該成爲上一頁,那麼我會這樣做。但有些時候這是不可能的,並且推薦人檢查可能是您唯一的選擇(除了讓用戶使用後退按鈕) 。 – Oli 2009-02-08 02:26:38

+0

我曾經試圖通過會話變量做到這一點,但這是一個錯誤;變得脆弱並且一直崩潰。你的選擇是奧利提到的,或者使用JavaScript來點擊後退按鈕。 – 2009-02-08 16:01:58

0

您可以隨時使用客戶端選項,這是很簡單的:

<a href="javascript:history.go(1)">Back</a> 
+3

我真的很討厭這樣的鏈接。首先,當您從保存的鏈接/其他網站進入頁面時,它們不起作用。其次,我只爲受信任的站點啓用Javascript(使用NoScript Firefox擴展)。 還有其他原因,但評論空間有限。 – 2009-03-18 11:04:18

25

其實這是go(-1)

<input type=button value="Previous Page" onClick="javascript:history.go(-1);"> 
15

該解決方案制定了我:

<a href="{{request.META.HTTP_REFERER}}">Go back</a> 

但是,這之前增加'django.core.context_processors.request',在項目的設置TEMPLATE_CONTEXT_PROCESSORS

0

對於Django admin更改表單中的「後退」按鈕,我最終要做的是自定義模板過濾器,以解析和解碼模板中的'preserved_filters'變量。我放在一個自定義模板/管理/ submit_line.html文件中的以下內容:

<a href="../{% if original}../{% endif %}?{{ preserved_filters | decode_filter }}"> 
    {% trans "Back" %} 
</a> 

然後創建一個自定義模板過濾器:

from urllib.parse import unquote 
from django import template 

def decode_filter(variable): 
    if variable.startswith('_changelist_filters='): 
     return unquote(variable[20:]) 
    return variable 

register = template.Library() 
register.filter('decode_filter', decode_filter) 
0

使用客戶端的解決辦法是妥善解決。

<a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a>