Django - 如何从模型实例获取管理员URL

Gre*_*reg 27 python django django-models django-admin

我正在尝试在保存新模型实例时向用户发送电子邮件,并且我希望该电子邮件包含指向该模型实例的管理页面的链接.有没有办法获得正确的URL?我认为Django必须将信息存储在某个地方.

Chr*_*att 42

不试图扯掉@JosvicZammit,但ContentType在这里使用是错误的方法.这只是一个浪费的数据库查询.您可以从_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,))
Run Code Online (Sandbox Code Playgroud)

  • 如果你能在评论中有效地做代码样本,我会的.这绝对是一团糟.我注意到Josvic得到了答案,他得到了信任,所以,没有冒犯,但真的不确定为什么你应该在事后差不多一年后关心. (6认同)

Jos*_*mit 32

这个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,))
Run Code Online (Sandbox Code Playgroud)

self指父模型类,即self.id是指对象的实例id.您还可以property通过将@property装饰器粘贴在方法签名的顶部将其设置为模型.


Mar*_*ndi 8

这给出了与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,))
Run Code Online (Sandbox Code Playgroud)


rad*_*tek 6

只需使用这个也准备好python 3的衬垫:

from django.urls import reverse

reverse('admin:{0}_{1}_change'.format(self._meta.app_label, self._meta.model_name), args=(self.pk,))
Run Code Online (Sandbox Code Playgroud)

更多关于django管理站点文档中的内容,撤消管理员网址.

  • 只是因为它是可能的: `reverse('admin:{m.app_label}_{m.model_name}_change'.format(m=self._meta), args=[self.pk])` (2认同)

met*_*mit 5

因此,结合 Chris、Josvic 和 Josh 的答案,这里有一个复制粘贴方法,您可以添加到您的模型中(在 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,))
Run Code Online (Sandbox Code Playgroud)