Antes de Django 1.0 había una manera fácil de obtener la URL de administrador de un objeto, y había escrito un pequeño filtro que usaría así: <a href="{{ object|admin_url }}" .... > ... </a>
Básicamente estaba usando la función de inversión de URL con el nombre de la vista siendo 'django.contrib.admin.views.main.change_stage'
reverse( 'django.contrib.admin.views.main.change_stage', args=[app_label, model_name, object_id] )
para obtener la url.
Como habrás adivinado, estoy tratando de actualizar a la última versión de Django, y este es uno de los obstáculos que encontré, ese método para obtener la URL de administrador ya no funciona.
¿Cómo puedo hacer esto en django 1.0? (o 1.1 para el caso, ya que estoy tratando de actualizar a la última versión en el svn).
fuente
Puede usar el solucionador de URL directamente en una plantilla, no hay necesidad de escribir su propio filtro. P.ej
{% url 'admin:index' %}
{% url 'admin:polls_choice_add' %}
{% url 'admin:polls_choice_change' choice.id %}
{% url 'admin:polls_choice_changelist' %}
Ref: Documentación
fuente
Esto es similar a la solución de hansen_j, excepto que utiliza espacios de nombres de URL , admin: es el espacio de nombres de la aplicación predeterminada del administrador.
fuente
args=[object.pk]
lugar deargs=[object.id]
. Cubre el caso más común, cuando el campo de clave primaria tiene otro nombre queid
.object._meta.app_label
déjame finalmente obtener el nombre de la propia aplicación de autenticación de django. Esauth
, por ejemplo,reverse(admin:auth_user_change, args=[object.id])
para saltar a la página de cambio de usuarioHay otra forma para las versiones posteriores, por ejemplo en 1.10 :
¿Dónde
opts
está algo comomymodelinstance._meta
oMyModelClass._meta
Un problema es que no puede acceder a los atributos de subrayado directamente en las plantillas de Django (como
{{ myinstance._meta }}
), por lo que debe pasar elopts
objeto desde la vista como contexto de plantilla.fuente
Esencialmente lo mismo que la respuesta de Mike Ramirez, pero más simple y más cercano en estilística al
get_absolute_url
método estándar de django :fuente
Para pre 1.1 django es simple (para la instancia predeterminada del sitio de administración):
fuente
Si está utilizando 1.0, intente crear una etiqueta de plantilla personalizada que se vea así:
luego use {% adminpageurl my_object%} en su plantilla (no olvide cargar primero la etiqueta de plantilla)
fuente
Resolví esto cambiando la expresión a:
Esto requiere / asume que la raíz url conf tiene un nombre para el manejador de url "admin", principalmente ese nombre es "django-admin",
es decir, en la raíz url conf:
Parece estar funcionando, pero no estoy seguro de su limpieza.
fuente
Aquí hay otra opción, usando modelos:
Cree un modelo base (o simplemente agregue el método admin_link a un modelo en particular)
Heredar de ese modelo base
Úselo en una plantilla
O ver
fuente