2012-06-22 7 views
14

Ich verwende derzeit Djangos redirect() - Methode, um URLs zu erstellen, an die umgeleitet werden soll. Ich möchte nicht, die URL codieren, so habe ich es so getan:Django redirect() mit Anker (#) Parameter

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

Was mich wie zu etwas braucht:

/home/test-123/

Aber ich sind ein clientseitige Zugabe für bestimmte URLs Tracking so wollte ich Anker am Ende verwenden, um Dinge wie Benutzer zum ersten Mal, wie diese Besuche zu identifizieren:

/home/test-123/# ersten

Short Wenn ich die obige URL in der redirect() -Methode hartkodiere, gibt es eine elegantere Alternative, den Anker an das Ende meiner konstruierten URLs anzuhängen?

Danke, G

Antwort

19

redirect()accepts URL Sie reverse()to get one und Anhängen von Hash-Teil verwenden:

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

Auch gibt es eine Abkürzung django.shortcuts.resolve_url, die funktioniert wie:

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

Ich wollte, dass schreiben, aber sie waren schneller;) Der einzige Unterschied ist, dass ich wahrscheinlich einige setzen würde Dokumentationsverknüpfungen, verwenden Sie die Zeichenfolgenformatierung anstelle der Verkettung und trennen Sie diese beiden Zeilen, um zu betonen, dass der Import am Anfang der Datei erfolgen soll. Wie auch immer, +1 – Tadeck

+0

@Tadeck Thanks =) Ich habe die Antwort aktualisiert. – okm

7

[Arbeitet nur bis Django 1.8, nicht f unctional in Django 1.9+, siehe Kommentare!]

Sie können einen Anker in den regulären Ausdruck in urls.py hinzufügen. Hier ist ein Beispiel aus einer Beispiel-Forum-App, die zum gewünschten Beitrag in einem Thread springt.

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

Das ist wirklich elegant, so viel besser als der akzeptierte/upvoted Hack, danke fürs Teilen! –

+2

Es sieht so aus, als ob in 'Django 1.9' '' '' '' '' '' '' '' '23 '' sein wird, so dass Sie nicht den erwarteten Effekt erhalten, wenn Sie' reverse' verwenden. Schnelle und dreckige Lösung ist das Hinzufügen von '.replace ('% 23', '#')'. – Sapphire64