create - Obtener Django admin url para un objeto
include django (9)
Aquí hay otra opción, usando modelos:
Cree un modelo base (o simplemente agregue el método admin_link a un modelo en particular)
class CommonModel(models.Model):
def admin_link(self):
if self.pk:
return mark_safe(u''<a target="_blank" href="../../../%s/%s/%s/">%s</a>'' % (self._meta.app_label,
self._meta.object_name.lower(), self.pk, self))
else:
return mark_safe(u'''')
class Meta:
abstract = True
Heredar de ese modelo base
class User(CommonModel):
username = models.CharField(max_length=765)
password = models.CharField(max_length=192)
Úselo en una plantilla
{{ user.admin_link }}
O ver
user.admin_link()
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 inversa url con el nombre de la vista como ''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 intentando 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).
Esencialmente es lo mismo que la respuesta de Mike Ramirez, pero más simple y más cercana en estilo al método get_absolute_url
estándar de django:
def get_admin_url(self):
return reverse(''admin:%s_%s_change'' % (self._meta.app_label, self._meta.model_name),
args=[self.id])
Hay otra manera para las versiones posteriores, por ejemplo en 1.10 :
{% load admin_urls %}
<a href="{% url opts|admin_urlname:''add'' %}">Add user</a>
<a href="{% url opts|admin_urlname:''delete'' user.pk %}">Delete this user</a>
Donde opts
es algo como mymodelinstance._meta
o MyModelClass._meta
Un problema es que no se puede acceder a los atributos del subrayado directamente en las plantillas de Django (como {{ myinstance._meta }}
) por lo que debe pasar el objeto opts
desde la vista como contexto de la plantilla.
Lo resolví cambiando la expresión a:
reverse( ''django-admin'', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )
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:
url(r''^admin/(.*)'', admin.site.root, name=''django-admin''),
Parece estar funcionando, pero no estoy seguro de su limpieza.
Para pre 1.1 django, es simple (para la instancia predeterminada del sitio de administración):
reverse(''admin_%s_%s_change'' % (app_label, model_name), args=(object_id,))
Puede usar la resolución de URL directamente en una plantilla, no es necesario 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: Documentation
Si está utilizando 1.0, intente crear una plantilla personalizada que se vea así:
def adminpageurl(object, link=None):
if link is None:
link = object
return "<a href=/"/admin/%s/%s/%d/">%s</a>" % (
instance._meta.app_label,
instance._meta.module_name,
instance.id,
link,
)
simplemente utiliza {% adminpageurl my_object%} en tu plantilla (no olvides cargar primero la plantilla)
Tuve un problema similar en el que intentaba llamar al reverse(''admin_index'')
y django.core.urlresolvers.NoReverseMatch
constantemente errores de django.core.urlresolvers.NoReverseMatch
.
Resulta que tenía las viejas URL de administrador de formato en mi archivo urls.py.
Tenía esto en mis plantillas url:
(r''^admin/(.*)'', admin.site.root),
que hace funcionar las pantallas de administración, pero es la forma obsoleta de hacerlo. Necesitaba cambiarlo a esto:
(r''^admin/'', include(admin.site.urls) ),
Una vez que hice eso, toda la bondad que se prometió en los documentos de URL de Reversing Admin comenzó a funcionar.
from django.core.urlresolvers import reverse
def url_to_edit_object(object):
url = reverse(''admin:%s_%s_change'' % (object._meta.app_label, object._meta.model_name), args=[object.id] )
return u''<a href="%s">Edit %s</a>'' % (url, object.__unicode__())
Esto es similar a la solución de hansen_j, excepto que usa espacios de nombres url , admin: siendo el espacio de nombres de la aplicación predeterminada del administrador.