2012-06-22 20 views
14

我目前正在使用Django的重定向()方法來構造URL重定向到。我不想硬編碼的網址,所以我一直在做這樣的:Django重定向()與錨(#)參數

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

這需要我這樣的:

/家/測試-123/

但我「M加入一些客戶端的特定網址跟蹤,所以我想用就完了錨識別之類的東西第一次用戶訪問這樣的:

/家/測試-123 /#第一

短在redirect()方法中對上面的URL進行硬編碼,有沒有更好的方法將錨點追加到我構建的URL的末尾?

感謝, 摹

回答

19

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

我去張貼,但你更快;)唯一的區別是,我可能會放一些文檔鏈接,使用字符串格式而不是連接,並且更多地分開這兩行來強調導入應該在文件的開始處發生。無論如何,+1 – Tadeck

+0

@Tadeck謝謝=)我已經更新了答案。 – okm

7

[只有工作到Django 1.8,而不是f在Django 1.9+中爲unctional,請參閱註釋!]

您可以在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

這真的很高雅,比接受/最高的黑客好得多,謝謝分享! –

+2

它看起來像在最近的Django 1.9中'#'將會被轉義爲'%23',所以如果你使用'reverse'函數,你將不會得到預期的效果。快速修復的方法是添加'.replace('%23','#')'。 – Sapphire64