получение django адреса администратора для объекта

<p>до django 1.0 существовал простой способ получить административный url-адрес объекта, и я написал небольшой фильтр, который я бы использовал следующим образом: <code><a href="{{ object|admin\_url }}" .... > ... </a></code></p><p>в основном я использовал функцию обратного url с именем представления <code>'django.contrib.admin.views.main.change\_stage'</code></p><pre><code>reverse( 'django.contrib.admin.views.main.change\_stage', args=[app\_label, model\_name, object\_id] ) </code></pre><p>чтобы получить url.</p><p>как вы, наверное, догадались, я пытаюсь обновиться до последней версии django, и это одно из препятствий, с которыми я столкнулся, этот метод получения url администратора больше не работает.</p><p>как я могу сделать это в django 1.0? (или 1.1 в этом отношении, поскольку я пытаюсь обновить до последней версии в svn).</p>

<p>у меня была похожая проблема, когда я пытался вызвать <code>reverse('admin\_index')</code> и постоянно получал ошибки <code>django.core.urlresolvers.noreversematch</code>.</p><p>оказывается, в моем файле urls.py были адреса администратора старого формата.</p><p>у меня было это в моих urlpatterns:</p><pre><code>(r'^admin/(.*)', admin.site.root), </code></pre><p>который заставляет работать административные экраны, но является устаревшим способом сделать это. мне нужно было изменить это на это:</p><pre><code>(r'^admin/', include(admin.site.urls) ), </code></pre><p>как только я это сделал, все добро, которое было обещано в документах <a href="https://docs.djangoproject.com/en/dev/ref/contrib/admin/#admin-reverse-urls">обратные адреса администратора</a> , заработало.</p>

<p>вы можете использовать преобразователь url-адресов непосредственно в шаблоне, нет необходимости писать свой собственный фильтр. например.</p><p><code>{% url 'admin:index' %}</code></p><p><code>{% url 'admin:polls\_choice\_add' %}</code></p><p><code>{% url 'admin:polls\_choice\_change' choice.id %}</code></p><p><code>{% url 'admin:polls\_choice\_changelist' %}</code></p><p>ссылка: <a href="https://docs.djangoproject.com/en/dev/ref/contrib/admin/#reversing-admin-urls">документация</a> </p>

<pre><code>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\_\_()) </code></pre><p>это похоже на решение hansen\_j за исключением того, что оно использует <a href="http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces">пространства имен url</a> , admin: является пространством имен приложения по умолчанию для администратора.</p>

<p>есть и другой способ для более поздних версий, например <a href="https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#reversing-admin-urls">в 1.1</a> :</p><pre><code>{% 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> </code></pre><p>где <code>opts</code> - это что-то вроде <code>mymodelinstance.\_meta</code> или <code>mymodelclass.\_meta</code></p><p>одно замечание: вы не можете получить доступ к атрибутам подчеркивания напрямую в шаблонах django (например, <code>{{ myinstance.\_meta }}</code>), поэтому вам нужно передать объект <code>opts</code> из представления как контекст шаблона.</p>

<p>для pre 1.1 django это просто (для экземпляра сайта администратора по умолчанию):</p><pre><code>reverse('admin\_%s\_%s\_change' % (app\_label, model\_name), args=(object\_id,)) </code></pre>

<p>по сути то же самое, что и ответ майка рамиреса, но проще и ближе по стилистике к методу django стандартному <code>get\_absolute\_url</code>:</p><pre><code>def get\_admin\_url(self): return reverse('admin:%s\_%s\_change' % (self.\_meta.app\_label, self.\_meta.model\_name), args=[self.id]) </code></pre>

<p>если вы используете 1.0, попробуйте создать собственный тег шаблона, который будет выглядеть следующим образом:</p><pre><code>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, ) </code></pre><p>затем просто используйте {% adminpageurl my\_object%} в своем шаблоне (не забудьте сначала загрузить тег шаблона)</p>

<p>я решил это, изменив выражение на:</p><pre><code>reverse( 'django-admin', args=["%s/%s/%s/" % (app\_label, model\_name, object\_id)] ) </code></pre><p>это требует/предполагает, что у корневого url-адреса есть имя для обработчика url-адреса "admin", в основном это имя "django-admin",</p><p>то есть в корне url conf:</p><pre><code>url(r'^admin/(.*)', admin.site.root, name='django-admin'), </code></pre><p>вроде бы работает, но я не уверен в его чистоте.</p>

<p>вот еще один вариант, используя модели:</p><p>создайте базовую модель (или просто добавьте метод admin\_link к конкретной модели)</p><pre><code>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 </code></pre><p>унаследовать от этой базовой модели</p><pre><code> class user(commonmodel): username = models.charfield(max\_length=765) password = models.charfield(max\_length=192) </code></pre><p>используйте это в шаблоне</p><pre><code>{{ user.admin\_link }} </code></pre><p>или посмотреть</p><pre><code>user.admin\_link() </code></pre>