我正在尝试在保存新模型实例时向用户发送电子邮件,并且我希望电子邮件包含指向该模型实例管理页面的链接。有没有办法获得正确的网址?我认为 Django 必须将这些信息存储在某个地方。
问问题
22634 次
5 回答
59
不是试图扯掉@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,))
于 2012-05-02T20:13:12.490 回答
44
这个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
粘贴在方法签名上来将其设置为模型上的a。@property
编辑:下面Chris Pratt 的答案在表上保存了一个数据库查询ContentType
。我的回答仍然“有效”,并且不太依赖于 Django 模型instance._meta
内部。供参考。
于 2012-05-02T19:26:03.617 回答
12
这给出了与 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,))
于 2014-10-04T07:14:42.897 回答
10
只需使用这个也准备好 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 管理站点文档,reversing admin urls中。
于 2013-11-16T03:15:20.337 回答
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,))
于 2015-07-30T22:03:59.437 回答