Получение админки Django для объекта - PullRequest
146 голосов
/ 29 марта 2009

До 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).

Ответы [ 9 ]

357 голосов
/ 28 мая 2010

Вы можете использовать преобразователь URL-адресов непосредственно в шаблоне, нет необходимости писать собственный фильтр. Э.Г.

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

{% url 'admin:polls_choice_change' choice.id %}

{% url 'admin:polls_choice_changelist' %}

Ссылка: Документация

86 голосов
/ 12 ноября 2009
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__())

Это похоже на решение hansen_j, за исключением того, что оно использует пространства имен url , admin: пространство имен приложения по умолчанию для администратора.

54 голосов
/ 12 мая 2009

У меня была похожая проблема, когда я пытался дозвониться до reverse('admin_index'), и постоянно получал django.core.urlresolvers.NoReverseMatch ошибок.

Оказывается, у меня в файле urls.py были адреса администратора старого формата.

У меня было это в моих urlpatterns:

(r'^admin/(.*)', admin.site.root),

, который заставляет работать административные экраны, но является устаревшим способом сделать это. Мне нужно было изменить это на это:

(r'^admin/', include(admin.site.urls) ),

Как только я это сделал, все добро, которое было обещано в Обратных административных URL документах, заработало.

12 голосов
/ 17 июля 2014

Есть другой способ для более поздних версий, например в 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 из представления в качестве контекста шаблона.

10 голосов
/ 29 марта 2009

Для до 1.1 django это просто (для экземпляра сайта администратора по умолчанию):

reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))
8 голосов
/ 06 мая 2016

По сути, то же самое, что и ответ Майка Рамиреса, но проще и ближе по стилистике к стандарту Джанго

def get_admin_url(self):
    return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name),
                   args=[self.id])
3 голосов
/ 17 июля 2009

Если вы используете 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%} в своем шаблоне (не забудьте сначала загрузить тег шаблона)

1 голос
/ 29 марта 2009

Я решил это, изменив выражение на:

reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )

Для этого требуется / предполагается, что у корневого URL-адреса conf есть имя для обработчика URL-адреса "admin", в основном это имя "django-admin",

т.е. в корне url conf:

url(r'^admin/(.*)', admin.site.root, name='django-admin'),

Кажется, он работает, но я не уверен в его чистоте.

0 голосов
/ 03 августа 2010

Вот еще один вариант использования моделей:

Создание базовой модели (или просто добавление метода 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()
...