如何在Django的URL中识别锚点?

时间:2013-02-14 22:13:26

标签: python django django-urls

我正在进行幻灯片放映,每张幻灯片都有这样的网址格式:articles/1234#slide=5。我想从url.py文件中的url中检索slide=5部分,然后将其传递给相应的视图函数,最后将其传递给模板并渲染右侧幻灯片。网址设置如下:

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

但它似乎无法从网址获取current_slide变量。我想它与锚点部分有关,因为它没有转移到服务器上。但是如果我忽略我的网址设置中的锚点部分并使用javascript来处理这个标签,似乎每次我在浏览器中输入网址时,它首先渲染没有锚点部分的页面,然后跳转到我想要的右侧幻灯片。它无法直接呈现正确的幻灯片。我怎么能解决这个问题?

3 个答案:

答案 0 :(得分:5)

你在问题​​中遇到了它。 URL的锚点部分未传递给服务器,它仅用于客户端。为什么不使用标准的get参数:

articles/1234?slide=5

由于你坚持使用这种网址格式,你可能想要使用某种类型的动画卷轴,这可能会减少这种问题,请查看这个问题的答案jquery smooth scroll to an anchor?

答案 1 :(得分:2)

没有浏览器将“hashtag”发送到服务器。

其中一个常见方法是让javascript在加载/读取时捕获主题标签,并调用函数初始化页面(通过ajax)。

此外,常见的术语是“hashbang url”。如果您搜索该术语,您将找到更多相关信息。

页面正在跳转,因为#用于指向HTML规范中的页面锚点。 http://example.com/gallery/1234#slide5告诉浏览器转到slide5

上的http://example.com/gallery/1234锚点

答案 2 :(得分:0)

锚点(#后面的位)不是匹配的URL位的一部分。它们用于页面内的锚点(即链接)。它们通常是为了浏览器的利益(因此浏览器可以滚动到页面的那一部分)而不是服务器,但是这些天人们似乎在滥用它们。 Django不会选择它们并不奇怪,因为它们不被认为是服务器URL的有用部分。

以下是旧版HTML规范的文档,但它仍然有效:http://www.w3.org/TR/html4/struct/links.html#h-12.2.3

怎么做:

如果要在视图中显示此内容,请查看Request对象。查看request.path_inforequest.path。这将为您提供完整的URL。您可以使用正则表达式从中提取它。

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参数。