2012-06-22 13 views
14

Attualmente sto usando il metodo redirect() di Django per costruire URL a cui reindirizzare. Io non voglio hardcode l'URL in modo ho fatto in questo modo:Django redirect() con parametri di ancoraggio (#)

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

Il che mi porta a qualcosa di simile:

/home/test-123/

Ma io 'm aggiungendo un po' di monitoraggio per gli URL specifici lato client in modo ho voluto usare ancoraggi sulla fine di identificare le cose come la prima volta le visite degli utenti come questo:

/home/test-123/# primo

brevedi hardcoding dell'URL sopra nel metodo redirect(), c'è un'alternativa più elegante per aggiungere l'ancora alla fine dei miei URL costruiti?

Grazie, G

risposta

19

redirect()accepts URL, è possibile utilizzare reverse()to get one e aggiungendo hash parte:

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

Inoltre, v'è una scorciatoia django.shortcuts.resolve_url che funziona come:

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

stavo per postare, ma si erano più veloci;) L'unica differenza è che avrei probabilmente mettere un po ' collegamenti alla documentazione, utilizzare la formattazione della stringa anziché la concatenazione e separare ulteriormente queste due righe per sottolineare che l'importazione dovrebbe avvenire all'inizio del file. Ad ogni modo, +1 – Tadeck

+0

@Tadeck Grazie =) Ho aggiornato la risposta. – okm

7

[Solo lavorando fino a Django 1.8, non f unzionale in Django 1.9+, vedere i commenti!]

È possibile aggiungere un ancoraggio nell'espressione regolare in urls.py. Ecco un esempio da un'app di forum di esempio che salterà al post desiderato in una discussione.

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

Questo è davvero elegante, molto meglio dell'hac accettato/upvoted, grazie per la condivisione! –

+2

Sembra che nella recente versione di Django 1.9 '# vada in escape come'% 23', quindi non si otterrà l'effetto previsto se si utilizza la funzione 'reverse'. La soluzione rapida e sporca consiste nell'aggiungere '.replace ('% 23', '#')'. – Sapphire64

Problemi correlati