2

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

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

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

4

3 回答 3

5

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

articles/1234?slide=5

由于您坚持使用这种 url 格式,您可能想要使用某种动画滚动,这可能会使这不那么烦人,请查看这个问题的答案jquery smooth scroll to an anchor?

于 2013-02-14T22:16:39.840 回答
2

没有浏览器将“主题标签”发送到服务器。

解决此问题的一种常见方法是让 javascript 在 load/read 上捕获主题标签,并调用一个函数来初始化页面(通过 ajax)。

此外,对此的常用术语是“hashbang url”。如果您搜索该术语,您会发现更多相关信息。

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

于 2013-02-14T22:18:15.397 回答
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 参数。

于 2013-02-14T22:23:35.243 回答