2013-02-14 25 views
2

我在做幻燈片演示,每張幻燈片都有這樣的url格式:articles/1234#slide=5。我想從url.py文件中的URL中檢索slide=5部分,然後將其傳遞給相應的視圖函數,最後將其傳遞給模板並呈現右側幻燈片。該URL設置如下:如何識別Django中的網址錨點?

url(r'^(?P<article_id>\d+)#slide=(?P<current_slide>\d{1,2})$', 'articles.views.show_article') 

但它似乎無法從URL中current_slide變量。我想這與錨點部分有關,因爲它不會傳輸到服務器。但是,如果我忽略了我的url設置中的錨點部分並使用javascript來處理此hashtag,那麼似乎每次我在瀏覽器中輸入url時,它都會首先呈現沒有錨點部分的頁面,然後跳轉到我想要的右側幻燈片。它不能直接渲染正確的幻燈片。我怎麼能解決這個問題?

+0

這不是一個標籤,它是一個錨點! – Joe 2013-02-14 22:21:26

回答

5

你在你的問題上擊中它。 URL的錨部分不傳遞給服務器,它僅用於客戶端。爲什麼不使用標準的GET參數:

articles/1234?slide=5 

既然你堅持這個網址格式,您可能需要使用某種類型的動畫滾動這可能使這個那麼煩人,檢出這個問題的答案jquery smooth scroll to an anchor?

+0

我不是從頭開始做的,我正在處理其他人的項目,它已經有一些與此hashtag相關的js文件,所以我寧願堅持使用這個hashtag格式並找到一些解決方法。有沒有辦法通過標籤來達到這個目的? – chaonextdoor 2013-02-14 22:22:46

+0

你應該知道'hashtag'是這個錯誤的詞。我回答了你的問題(見下文)。 – Joe 2013-02-14 22:29:34

2

沒有瀏覽器向服務器發送「hashtag」。

解決這個問題的常用方法之一是讓JavaScript捕獲加載/讀取的hashtag,並調用一個函數來初始化頁面(通過ajax)。

另外,這個常見術語是「hashbang url」。如果你搜索這個詞,你會發現更多的相關信息。

由於#用於指向HTML規範中的頁面定位符,因此頁面正在跳轉。 http://example.com/gallery/1234#slide5告訴瀏覽器去slide5定位點http://example.com/gallery/1234

+0

如何讀取服務器是否向客戶端發送了帶有hashtag的響應?沒有使用JavaScript? – Kalanamith 2016-09-13 03:57:32

0

定位符(#之後的位)不是匹配的URL位的一部分。它們用於頁面中的錨點(即鏈接)。它們通常是爲了瀏覽器的利益(因此瀏覽器可以滾動到頁面的那一點)而不是服務器,但是近來人們似乎在濫用它們。由於Django不被認爲是服務器URL的有用部分,所以並不奇怪。

這裏是HTML的舊規範文檔,但它仍然是有效的:http://www.w3.org/TR/html4/struct/links.html#h-12.2.3

如何做到這一點:

如果你想獲得這個在你看來,看在Request對象。請看request.path_inforequest.path。這會給你完整的網址。您可以使用正則表達式從中提取它。

import re 

input = "articles/1234#slide=5" 

m = re.search("#slide=([0-9]*)", input) 
try: 
    print int(m.group(1)) 
except ValueError: 
    print "didn't get a number" 

正如Rob所說的,您應該爲此使用get參數。

+2

根本不在請求對象中,因爲它通常不會發送到服務器。 – 2013-02-14 22:32:43

+0

我沒有可檢查的環境,但如果您訪問給定的URL(可能包含錨片段),則完整的URL將傳遞到服務器。無法檢查Django,但我會很驚訝。 – Joe 2013-02-14 22:35:41

+0

@DanielRoseman你是對的。我只是做了一個測試,並且看不到請求對象中的錨點部分。 – chaonextdoor 2013-02-14 22:45:09