我用Django工具,我想知道是否有一種簡單的方法來創建一個「回」鏈接到上一頁使用模板系統。Django模板:創建一個「後退」鏈接?
我認爲,在最糟糕的情況下,我可以從視圖函數中的請求對象獲取這些信息,並將其傳遞給模板呈現方法,但我希望能夠以某種方式避免所有這些樣板代碼。
我檢查了Django模板文檔,我沒有看到任何明確提到這一點。
我用Django工具,我想知道是否有一種簡單的方法來創建一個「回」鏈接到上一頁使用模板系統。Django模板:創建一個「後退」鏈接?
我認爲,在最糟糕的情況下,我可以從視圖函數中的請求對象獲取這些信息,並將其傳遞給模板呈現方法,但我希望能夠以某種方式避免所有這些樣板代碼。
我檢查了Django模板文檔,我沒有看到任何明確提到這一點。
那麼你可以啓用:
'django.core.context_processors.request',
在settings.TEMPLATE_CONTEXT_PROCESSORS
塊和鉤出來的引薦,但是這是一個有點肉麻,並可能打破所有的地方。
大多數你想要這個的地方(例如SO上的編輯帖子頁)你有一個真正的對象可以連接到(在這個例子中,這個帖子),這樣你就可以很容易地找出正確的前一頁應該是什麼是。
這是一個很好的信息,在閱讀本文後,我偶然發現了文檔中的「Model.get_absolute_url」。這實際上解決了我的問題,但如果您沒有指向的對象,我仍然很好奇最好的行動方案。 – 2009-02-08 02:24:09
真的取決於情況。如果有一種方法可以確定哪個頁面應該成爲上一頁,那麼我會這樣做。但有些時候這是不可能的,並且推薦人檢查可能是您唯一的選擇(除了讓用戶使用後退按鈕) 。 – Oli 2009-02-08 02:26:38
我曾經試圖通過會話變量做到這一點,但這是一個錯誤;變得脆弱並且一直崩潰。你的選擇是奧利提到的,或者使用JavaScript來點擊後退按鈕。 – 2009-02-08 16:01:58
您可以隨時使用客戶端選項,這是很簡單的:
<a href="javascript:history.go(1)">Back</a>
我真的很討厭這樣的鏈接。首先,當您從保存的鏈接/其他網站進入頁面時,它們不起作用。其次,我只爲受信任的站點啓用Javascript(使用NoScript Firefox擴展)。 還有其他原因,但評論空間有限。 – 2009-03-18 11:04:18
其實這是go(-1)
。
<input type=button value="Previous Page" onClick="javascript:history.go(-1);">
該解決方案制定了我:
<a href="{{request.META.HTTP_REFERER}}">Go back</a>
但是,這之前增加'django.core.context_processors.request',
在項目的設置TEMPLATE_CONTEXT_PROCESSORS
。
對於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)
使用客戶端的解決辦法是妥善解決。
<a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a>
當你回去時,頁面被重新渲染,這意味着任何處理(數據庫查詢,資源下載等)都會重新發生。爲了防止這種情況,請使用`@ cache_page`裝飾器。 – 2016-05-07 15:55:59