Подтвердить что ты не робот

Django - Как получить URL-адрес администратора из экземпляра модели

Я пытаюсь отправить электронное письмо пользователю, когда новый экземпляр модели сохранен, и я хочу, чтобы в этом письме была ссылка на страницу администратора для этого экземпляра модели. Есть ли способ получить правильный URL? Я полагаю, что Джанго должен где-то хранить эту информацию.

4b9b3361

Ответ 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,))