我正在尝试在保存新模型实例时向用户发送电子邮件,并且我希望该电子邮件包含指向该模型实例的管理页面的链接。有没有办法获得正确的URL?我认为Django必须将信息存储在某个地方。
答案 0 :(得分:40)
不要试图扯掉@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,))
答案 1 :(得分:30)
此Django snippet应该:
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
。
答案 2 :(得分: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,))
答案 3 :(得分: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,))
有关详情,请参阅django管理站点文档reversing admin urls。
答案 4 :(得分:3)
所以,结合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,))