Я пытаюсь отправить электронное письмо пользователю, когда новый экземпляр модели сохранен, и я хочу, чтобы в этом письме была ссылка на страницу администратора для этого экземпляра модели. Есть ли способ получить правильный URL? Я полагаю, что Джанго должен где-то хранить эту информацию.
Django - Как получить URL-адрес администратора из экземпляра модели
Ответ 1
Этот фрагмент Django должен сделать:
from django.urls import reverse
from django.contrib.contenttypes.models import ContentType
from django.db import models
class MyModel(models.Model):
def get_admin_url(self):
content_type = ContentType.objects.get_for_model(self.__class__)
return reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(self.id,))
self
ссылается на класс родительской модели, то есть self.id
ссылается на id
экземпляра объекта. Вы также можете установить его как property
модели, @property
декоратор @property
поверх сигнатуры метода.
Ответ 2
Не пытаться сорвать @JosvicZammit, но использование ContentType
- неправильный подход. Это просто потерянный запрос к БД. Вы можете получить _meta
информацию из атрибута _meta
:
from django.urls import reverse
info = (model_instance._meta.app_label, model_instance._meta.model_name)
admin_url = reverse('admin:%s_%s_change' % info, args=(model_instance.pk,))
Ответ 3
Это дает тот же результат, что и фрагмент Josvic Zammit, но не попадает в базу данных:
from django.urls import reverse
from django.db import models
class MyModel(models.Model):
def get_admin_url(self):
return reverse("admin:%s_%s_change" % (self._meta.app_label, self._meta.model_name), args=(self.id,))
Ответ 4
Просто используйте этот лайнер, который также готов к Python 3:
from django.urls import reverse
reverse('admin:{0}_{1}_change'.format(self._meta.app_label, self._meta.model_name), args=(self.pk,))
Подробнее об этом в django admin site doc, обращая админские URL.
Ответ 5
Итак, объединяя ответы Криса, Йосвича и Джоша, здесь вы можете добавить метод копирования-вставки в свою модель (тестируется на Django 1.8.3).
def get_admin_url(self):
"""the url to the Django admin interface for the model instance"""
from django.core.urlresolvers import reverse
info = (self._meta.app_label, self._meta.model_name)
return reverse('admin:%s_%s_change' % info, args=(self.pk,))