2011-03-04 11 views
20

Por mucho que me encanta la documentación de django, the section on bookmarklets in the admin es extrañamente vago.Para un modelo de django, ¿cómo puedo obtener la URL de administración de django para agregar otra, o enumerar objetos, etc.?

Mi pregunta es esta: si estoy en una vista y tengo un modelo django (o, en algunos casos, un objeto real), ¿cómo puedo acceder a las páginas de administración correspondientes para ese modelo (u objeto) ? Si tengo el objeto coconut_transportation.swallow.objects.all() [34], ¿cómo puedo ir directamente a la página de administración para editar ese trago en particular?

Del mismo modo, ¿cómo puedo obtener la URL para que la página de administración agregue otra golondrina?

Respuesta

45

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#reversing-admin-urls

obj = coconut_transportation.swallow.objects.all()[34] 

# list url 
url = reverse("admin:coconut_transportation_swallow_changelist") 

# change url 
url = reverse("admin:coconut_transportation_swallow_change", args=[obj.id]) 

# add url 
url = reverse("admin:coconut_transportation_swallow_add") 
+0

La lista de cambios para una instancia de modelo en particular no es la "lista de objetos" –

+0

@NickT, buena llamada. Sin parámetros para la lista de cambios –

10

Puede recuperar esto desde la instancia del objeto real, esto funcionó para mí:

from django.core import urlresolvers 
from django.contrib.contenttypes.models import ContentType 

content_type = ContentType.objects.get_for_model(object.__class__) 
object_admin_url = django.core.urlresolvers.reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(object.pk,)) 

ver esto: http://djangosnippets.org/snippets/1916/

+0

Me gusta esto, ya que funciona para cualquier objeto - bonito :-) – guettli

9

En realidad se puede recuperar la información sin hacer una consulta a ContentTypes

Sólo tiene que añadir esto a su clase de modelo:

def get_admin_url(self): 
    return urlresolvers.reverse("admin:%s_%s_change" % 
     (self._meta.app_label, self._meta.model_name), args=(self.pk,)) 
+0

Es self._meta.model_name (no module_name). Aparte de eso, gran solución, ¡gracias! –

+0

module_name VS model_name depende de la versión de Django. Ver: https://code.djangoproject.com/ticket/19689 –

Cuestiones relacionadas