2012-06-22 31 views
14

Actualmente estoy usando el método de redirección de Django() para construir URL a las que redireccionar. No quiero a codificar la URL así que he estado haciendo de esta manera:Django redirect() con parámetros de anclaje (#)

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

Lo cual me lleva a algo como:

/home/test-123/

Pero estoy añadiendo un poco del lado del cliente de seguimiento de URL específicas, así que quería utilizar anclas en el extremo de identificar cosas como visitas de los usuarios de primera vez de esta manera:

/home/test-123/# primero

corto de la codificación de la URL anterior en el método redirect(), ¿existe una alternativa más elegante para agregar el anclaje al final de mis URL construidas?

Gracias, G

Respuesta

19

redirect()accepts URL, podría utilizar reverse()to get one y añadiendo parte de hash:

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

Además, hay un acceso directo django.shortcuts.resolve_url que funciona como:

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

que iba a publicar eso, sino que fuera más rápido;) La única diferencia es que, probablemente, me gustaría poner alguna enlaces de documentación, use el formato de cadena en lugar de la concatenación y separe estas dos líneas más para enfatizar que la importación debe ocurrir al principio del archivo. De todos modos, +1 – Tadeck

+0

@Tadeck Thanks =) He actualizado la respuesta. – okm

7

[Sólo funciona hasta Django 1.8, no f unctional en Django 1.9+, ver comentarios!]

Puede agregar un ancla en la expresión regular en urls.py. Aquí hay un ejemplo de una aplicación de foro de muestra que saltará a la publicación deseada en un hilo.

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

Eso es realmente elegante, mucho mejor que el hack aceptado/upvoted, ¡gracias por compartir! –

+2

Parece que en Django 1.9 reciente '' # 'se va a escapar como'% 23', por lo que no obtendrás el efecto esperado si usas la función 'reverse'. Solución rápida y sucia es agregar '.replace ('% 23', '#')'. – Sapphire64