Django redirect()与锚(#)参数

Giv*_*ivP 15 django

我目前正在使用Django的redirect()方法构建重定向到的URL.我不想对URL进行硬编码,所以我一直在这样做:

return redirect('main.views.home', home_slug=slug)
Run Code Online (Sandbox Code Playgroud)

这需要我:

/家/测试-123 /

但我正在为特定的URL添加一些客户端跟踪,所以我想在最后使用锚点来识别像首次用户访问这样的事情:

/家/测试-123 /#第一

如果没有在redirect()方法中对上述URL进行硬编码,是否有更优雅的替代方法将锚点附加到构造的URL的末尾?

谢谢,G

okm*_*okm 25

redirect() 接受URL,您可以使用它reverse() 来获取一个并附加哈希部分:

from django.core.urlresolvers import reverse

return redirect(reverse('main.views.home', kwargs={'home_slug':slug}) + '#first')
# or string formatting
return redirect('{}#first'.format(reverse('main.views.home', kwargs={'home_slug':slug})))
Run Code Online (Sandbox Code Playgroud)

此外,还有一个快捷方式django.shortcuts.resolve_url,其工作方式如下:

'{}#first'.format(resolve_url('main.views.home', home_slug=slug))
Run Code Online (Sandbox Code Playgroud)

  • 我打算发布,但你速度更快;)唯一的区别是我可能会放一些文档链接,使用字符串格式而不是连接,并将这两行分开来强调导入应该发生在文件的开头.无论如何,+1 (3认同)

scu*_*cum 8

[直到Django 1.8才开始工作,在Django 1.9+中无法正常工作,请看评论!]

您可以在urls.py中的正则表达式中添加锚点.这是一个示例论坛应用程序的示例,它将跳转到线程中的所需帖子.

views.py

return redirect(post_list, 
    slug=post.thread.slug, 
    page=1, 
    anchor='post_{0}'.format(post.id)
)
Run Code Online (Sandbox Code Playgroud)

urls.py

url(r'^thread/(?P<slug>[-\w]+)/(?P<page>[0-9]+)/#(?P<anchor>[-_\w]+)$', post_list, name='forum_view_thread'),
url(r'^thread/(?P<slug>[-\w]+)/(?P<page>[0-9]+)/$', post_list, name='forum_view_thread'),
url(r'^thread/(?P<slug>[-\w]+)/$', post_list, name='forum_view_thread'),
Run Code Online (Sandbox Code Playgroud)

  • 这真的很优雅,比接受/赞成的黑客好多了,谢谢分享! (2认同)
  • 看起来在最近的Django 1.9```将被转义为`%23`,所以如果使用`reverse`函数你将无法获得预期的效果.快速和肮脏的修复是添加`.replace('%23','#')`. (2认同)