2012-06-22 91 views
14

私は現在、リダイレクト先のURLを構築するためにDjangoのredirect()メソッドを使用しています。アンカー(#)パラメータ付きのDjango redirect()

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

ような何かに私を取る:

/ホーム/テスト-123/

でも、私はこのようにそれをやってきたので、URLをハードコーディングする必要はありません

/ホーム/テスト-123 /#最初

ショート:「ので、私はこのような初めてのユーザーの訪問のようなものを識別するために、最後にアンカーを使用したい特定のURLのトラッキングいくつかのクライアント側の追加メートル上記のURLをredirect()メソッドでハードコーディングすると、構築されたURLの最後にアンカーを追加するよりエレガントな方法がありますか?

おかげで、 G

答えて

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

私はそれを投稿するつもりだったが、あなたは速かった。唯一の違いは、私はおそらくいくつかを置くだろうということです)ドキュメントのリンクは、連結の代わりに文字列の書式を使用し、これらの2つの行をさらに分離して、インポートがファイルの先頭で行われるべきであることを強調します。とにかく、+1 – Tadeck

+0

@タデックありがとう=)私は答えを更新しました。 – okm

7

[Django 1.8までは、f 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

これは本当にエレガントで、受け入れられた/上書きされたハックよりずっと優れています。共有してくれてありがとう! –

+2

最近のDjangoのように見える1.9 '#'は '%23'としてエスケープされるので、' reverse'関数を使うと期待される効果が得られません。クイック・アンド・ダーティ修正は '.replace( '%23'、 '#')'を追加することです。 – Sapphire64

関連する問題