Получение URL-адреса администратора Django для объекта
До Django 1.0 был простой способ получить URL-адрес администратора объекта, и я написал небольшой фильтр, который я бы использовал следующим образом: <a href="{{ object|admin_url }}" .... > ... </a>
В основном я использовал обратную функцию url с именем вида 'django.contrib.admin.views.main.change_stage'
reverse( 'django.contrib.admin.views.main.change_stage', args=[app_label, model_name, object_id] )
чтобы получить URL.
Как вы, возможно, догадались, я пытаюсь обновить до последней версии Django, и это одно из препятствий, с которыми я столкнулся, этот метод получения URL-адреса администратора больше не работает.
Как я могу сделать это в django 1.0? (или 1.1 в этом отношении, поскольку я пытаюсь обновить до последней версии в svn).
Ответы
Ответ 1
У меня была аналогичная проблема, когда я попытался вызвать reverse('admin_index')
и постоянно получал ошибки django.core.urlresolvers.NoReverseMatch
.
Оказывается, у меня были старые URL-адреса администратора в моем файле urls.py.
У меня это было в моих urlpatterns:
(r'^admin/(.*)', admin.site.root),
который обрабатывает экраны администратора, но является устаревшим способом его выполнения. Мне нужно было изменить его на это:
(r'^admin/', include(admin.site.urls) ),
Как только я это сделал, все добро, которое было обещано в Reversing Admin URLs, начали работать.
Ответ 2
Вы можете использовать распознаватель URL прямо в шаблоне, нет необходимости писать собственный фильтр. Например.
{% url 'admin:index' %}
{% url 'admin:polls_choice_add' %}
{% url 'admin:polls_choice_change' choice.id %}
{% url 'admin:polls_choice_changelist' %}
Ссылка: Документация
Ответ 3
from django.core.urlresolvers import reverse
def url_to_edit_object(obj):
url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.model_name), args=[obj.id] )
return u'<a href="%s">Edit %s</a>' % (url, obj.__unicode__())
Это похоже на решение hansen_j за исключением того, что оно использует пространства имен url, admin: пространство имен приложения по умолчанию для администратора.
Ответ 4
Есть другой способ для более поздних версий, например в 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>
Где opts
- это что-то вроде mymodelinstance._meta
или MyModelClass._meta
Один из них: вы не можете получить доступ к атрибутам подчеркивания непосредственно в шаблонах Django (например, {{ myinstance._meta }}
), поэтому вам нужно передать объект opts
из представления в качестве контекста шаблона.
Ответ 5
Для pre 1.1 django это просто (для экземпляра администратора по умолчанию):
reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))
Ответ 6
По существу то же, что и Майк Рамирес, но проще и ближе в стилистике к стандартным методам get_absolute_url
django:
def get_admin_url(self):
return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name),
args=[self.id])
Ответ 7
Если вы используете 1.0, попробуйте создать собственный шаблонный шаблон, который выглядит так:
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,
)
то просто используйте {% adminpageurl my_object%} в своем шаблоне (не забудьте сначала загрузить templatetag)
Ответ 8
Я решил это, изменив выражение на:
reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )
Это требует/предполагает, что корневой url conf имеет имя для обработчика URL-адреса администратора, в основном это имя "django-admin",
то есть. в корневом url conf:
url(r'^admin/(.*)', admin.site.root, name='django-admin'),
Кажется, он работает, но я не уверен в его чистоте.
Ответ 9
Здесь другой вариант, используя модели:
Создайте базовую модель (или просто добавьте метод admin_link к определенной модели)
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
Наследовать от этой базовой модели
class User(CommonModel):
username = models.CharField(max_length=765)
password = models.CharField(max_length=192)
Используйте его в шаблоне
{{ user.admin_link }}
Или просмотреть
user.admin_link()