18

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

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

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

/home/test-123/

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

/home/test-123/#first

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

谢谢,G

4

3 回答 3

33

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

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

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

编辑Django 2.0,使用: from django.urls import reverse

于 2012-06-23T04:27:27.583 回答
8

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

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

视图.py

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

网址.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'),
于 2014-03-01T03:41:58.500 回答
0

只需使用:

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

from django.utils.encoding import uri_to_iri
uri_to_iri(urlresolvers.reverse('welcome'))
于 2018-06-27T12:55:59.933 回答