Получает 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).
9 ответов:
у меня была аналогичная проблема, где я бы попытался позвонить
reverse('admin_index')
и был постоянноdjango.core.urlresolvers.NoReverseMatch
ошибки.оказывается, у меня были старые URL-адреса администратора формата в моем urls.py файл.
у меня было это в моих urlpatterns:
(r'^admin/(.*)', admin.site.root),
который получает экраны администратора работает, но является устаревшим способом сделать это. Мне нужно было изменить его на это:
(r'^admin/', include(admin.site.urls) ),
как только я это сделал, вся доброта, которая была обещана в Реверсирование Url Администратора документы начали работать.
вы можете использовать распознаватель URL непосредственно в шаблоне, нет необходимости писать свой собственный фильтр. Е. Г.
{% url 'admin:index' %}
{% url 'admin:polls_choice_add' %}
{% url 'admin:polls_choice_change' choice.id %}
{% url 'admin:polls_choice_changelist' %}
Ref:документация
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: будучи пространством имен приложений по умолчанию администратора.
есть другой способ для более поздних версий, например в 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
один gotcha вы не можете получить доступ к атрибутам подчеркивания непосредственно в шаблонах Django (например
{{ myinstance._meta }}
) так что вы должны пройтиopts
объект из представления в качестве контекста шаблона.
для pre 1.1 django это просто (для экземпляра сайта администратора по умолчанию):
reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))
по сути то же самое, что и ответ Майка Рамиреса, но проще и ближе по стилистике к стандарту django
get_absolute_url
способ:def get_admin_url(self): return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name), args=[self.id])
Если вы используете 1.0, попробуйте сделать пользовательский templatetag, который выглядит так:
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)
Я решил это, изменив выражение на:
reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )
этого требует/предполагает, что URL-адрес корневой папки conf файл имеет имя "администратор" URL-адрес обработчика, в основном, что называется "Джанго-админ",
т. е. в корневом url conf:
url(r'^admin/(.*)', admin.site.root, name='django-admin'),
Кажется, это работает, но я не уверен в его чистоте.
вот еще один вариант, используя модели:
создать базовую модель (или просто добавить метод 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()