如何在Django中识别URL中的锚点?
我正在做一个幻灯片,每一张幻灯片的链接格式是这样的:articles/1234#slide=5
。我想在我的url.py文件中提取出slide=5
这一部分,然后把它传递给相应的视图函数,最后再传给模板,渲染出正确的幻灯片。我的网址设置如下:
url(r'^(?P<article_id>\d+)#slide=(?P<current_slide>\d{1,2})$', 'articles.views.show_article')
但是似乎无法从网址中获取到current_slide
这个变量。我猜这和链接中的锚点部分有关,因为它不会被传到服务器上。不过,如果我在网址设置中忽略锚点部分,使用JavaScript来处理这个哈希值,每次我在浏览器中输入网址时,它似乎会先渲染页面而不带锚点部分,然后再跳转到我想要的幻灯片。这样就不能直接渲染出正确的幻灯片。我该怎么解决这个问题呢?
3 个回答
在网址中,#后面的部分叫做锚点,它并不是网址的一部分,而是用来在网页内部链接的。锚点主要是为了方便浏览器使用,让它能滚动到页面的特定位置,而不是为了服务器。不过现在很多人似乎在滥用这个功能。Django不处理锚点也就不奇怪,因为服务器并不认为它是网址中有用的部分。
这里有一份旧版HTML的文档,但依然有效:http://www.w3.org/TR/html4/struct/links.html#h-12.2.3
怎么做:
如果你想在视图中获取这个锚点,可以查看请求对象。看看request.path_info
或request.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所说,你应该使用一个获取参数来处理这个问题。
没有浏览器会把“井号”发送到服务器。
解决这个问题的一个常见方法是用JavaScript在页面加载时捕捉到这个井号,然后调用一个函数来初始化页面(通过ajax)。
这个概念通常被称为“hashbang url”。如果你搜索这个词,你会找到更多相关的信息。
页面之所以会跳动,是因为井号在HTML规范中用来指向页面的锚点。比如,http://example.com/gallery/1234#slide5
这段链接告诉浏览器去 http://example.com/gallery/1234
页面上的 slide5
锚点。
你在问题中提到了关键点。网址中的锚点部分不会被发送到服务器,它只在用户的浏览器中使用。那么为什么不使用标准的获取参数呢:
articles/1234?slide=5
既然你只能使用这种网址格式,你可以考虑使用某种动画滚动效果,这样可能会让体验好一些。可以看看这个问题的回答 jquery平滑滚动到锚点?