【问题标题】:How to identify an anchor in a url in Django?如何在 Django 中识别 url 中的锚点?
【发布时间】:2013-01-30 20:33:45
【问题描述】:

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

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

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

【问题讨论】:

  • 这不是一个标签,它是一个锚!

标签: python django django-urls


【解决方案1】:

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

articles/1234?slide=5

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

【讨论】:

  • 我不是从头开始做的,我在做别人的项目,它已经有一些与这个标签相关的js文件,所以我宁愿坚持这个标签格式并找到以某种方式解决它。有什么方法可以通过标签实现这一目标?
  • 你应该知道'hashtag'是错误的词。我已经回答了你的问题(见下文)。
【解决方案2】:

锚点(# 之后的位)不是匹配的 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 参数。

【讨论】:

  • 在请求对象中根本不可用,因为它通常不会发送到服务器。
  • 我没有要检查的环境,但是如果您访问给定的 URL(可能包括锚片段),完整的 URL 将被传递到服务器。无法检查 Django,但我会感到非常惊讶。
  • @DanielRoseman 你是对的。我刚刚做了一个测试,在请求对象中看不到anchor部分。
【解决方案3】:

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

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

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

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

【讨论】:

  • 如果服务器向客户端发送带有标签的响应,如何读取?不使用javascript?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2014-11-14
  • 2020-12-15
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多