Django redirect()与锚(#)参数

时间:2012-06-22 23:08:51

标签: django

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

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

这让我有点像:

/家庭/测试-123 /

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

/家庭/测试-123 /#第一

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

谢谢, ģ

3 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分: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)
)

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

答案 2 :(得分:0)

只需使用:

url(r'^app/#/welcome/$', SomeView.as_view(), name='welcome'),

from django.utils.encoding import uri_to_iri
uri_to_iri(urlresolvers.reverse('welcome'))