reverse url admin django. Получить путь объекта в представлениях и шаблонах для изменения в админке
14 октября 2014 г. 4:23
Получить путь (url) объекта в представлениях и шаблонах для изменения в админке не сложно. Достаточно знать синтаксис первого аргумента метода reverse. Для того, чтобы что-то сделать с объектом из админки нужно сначала написать "admin:app_model_", где app - приложение, где находится необходимая модель, model - сама модель. И выбрать необходимое действие:
- add - добавить новый объект.
- change - изменить объект.
- changelist - открыть список объектов.
- history - открыть историю изменения объекта.
- delete - удалить объект.
Ниже я привёл примеры, которые наглядно это дело отображают (обратите внимание, что некоторые урлы требуют id объекта).
В представлениях (во вьюхах)
instance = Model.objects.get(id=1) # Найдём объект по id=1 к примеру
reverse('admin:app_model_add')
reverse('admin:app_model_change', args=(instance.id,))
reverse('admin:app_model_changelist')
reverse('admin:app_model_history', args=(instance.id,))
reverse('admin:app_model_delete', args=(instance.id,))
В шаблонах
В шаблоне можно получить необходимый url по следующим примерам:
{% url 'admin:app_model_add' %}
{% url 'admin:app_model_change' instance.id %}
{% url 'admin:app_model_changelist' %}
{% url 'admin:app_model_history' instance.id %}
{% url 'admin:app_model_delete' instance.id %}
Другие реверсы
Другие реверсы, которые могут быть полезны:
# Во вьюхе:
reverse('admin:index') # начальная страница админки
reverse('admin:logout') # урл выхода с сайта
reverse('admin:password_change') # смена пароля
reverse('admin:password_change_done') # страница успешного изменения пароля
reverse('admin:jsi18n') # i18n JavaScript
reverse('admin:app_list', args=(app_label ,)) # начальная страница приложения
reverse('admin:view_on_site', args=(content_type_id, instance.id,)) # редирект на страницу объекта. Объект должен при этом иметь get_absolute_url().
# В шаблонах:
{% url 'admin:index' %}
{% url 'admin:logout' %}
{% url 'admin:password_change' %}
{% url 'admin:password_change_done' %}
{% url 'admin:jsi18n' %}
{% url 'admin:app_list' app_label %}
{% url 'admin:view_on_site' content_type_id, instance.id %}
Ещё есть интересный момент - можно получить url для изменения объекта через get_urls() экземпляра вашего класса admin. Например:
@admin.register(Category)
class ExtendedCategoryAdmin(models.Admin):
list_display = ('name', 'full_path')
def full_path(self, obj):
result = []
items = obj.get_path()
for item in items:
url = reverse(u'admin:{}'.format(self.get_urls()[4].name), args=(item.id,))
result.append(u'<a href="{0}">{1}</a>'.format(url, item))
return ' > '.join(result)
full_path.short_description = u'Полный путь категории'
full_path.allow_tags = True
Данный код будет формировать строку из ссылок на изменение объектов в админке. self.get_urls()[4].name будет возвращать my_app_category_change.
Список стандартных урлов для манипулирования объектом admin:
self.get_urls()[0].name - changelist self.get_urls()[1].name - add self.get_urls()[2].name - history self.get_urls()[3].name - delete self.get_urls()[4].name - change
Также с помощью переопределения метода self.get_urls() можно добавлять свои url-ы, но это уже другая тема.
Ссылка на официальную документацию: reversing-admin-urls.
Похожие статьи:
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0