【问题标题】:Django redirect() with anchor (#) parameters带有锚点(#)参数的 Django 重定向()
【发布时间】:2012-06-22 23:08:51
【问题描述】:

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

return redirect('main.views.home', home_slug=slug)

这让我想到了这样的事情:

/home/test-123/

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

/home/test-123/#first

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

谢谢, G

【问题讨论】:

    标签: django


    【解决方案1】:

    redirect()accepts URL,您可以使用reverse() to get one 并附加哈希部分:

    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})))
    

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

    '{}#first'.format(resolve_url('main.views.home', home_slug=slug))
    

    EDIT 对于 Django 2.0,使用: from django.urls import reverse

    【讨论】:

    • 我正要发布那个,但你更快 ;) 唯一的区别是我可能会放置一些文档链接,使用字符串格式而不是连接并将这两行分开以更加强调导入应该发生在文件的开头。无论如何,+1
    【解决方案2】:

    [仅在 Django 1.8 之前工作,在 Django 1.9+ 中不起作用,请参阅 cmets!]

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

    views.py

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

    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'),
    

    【讨论】:

    • 这真的很优雅,比接受/赞成的黑客要好得多,感谢分享!
    • 在最近的 Django 1.9 中,# 似乎将被转义为%23,因此如果使用reverse 函数,您将无法获得预期的效果。快速而肮脏的解决方法是添加.replace('%23', '#')
    【解决方案3】:

    只需使用:

    url(r'^app/#/welcome/$', SomeView.as_view(), name='welcome'),
    
    from django.utils.encoding import uri_to_iri
    uri_to_iri(urlresolvers.reverse('welcome'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 2010-11-23
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      相关资源
      最近更新 更多