首先,感謝您閱讀我的問題。Django - 如何從模型實例獲取管理網址
我想在保存新模型實例時向用戶發送電子郵件,並且我希望電子郵件包含指向該模型實例的管理頁面的鏈接。有沒有辦法獲得正確的網址?我認爲Django必須將這些信息存儲在某個地方。
首先,感謝您閱讀我的問題。Django - 如何從模型實例獲取管理網址
我想在保存新模型實例時向用戶發送電子郵件,並且我希望電子郵件包含指向該模型實例的管理頁面的鏈接。有沒有辦法獲得正確的網址?我認爲Django必須將這些信息存儲在某個地方。
這Django snippet應該做的:
from django.core import urlresolvers
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 urlresolvers.reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(self.id,))
的self
指父模型類,即self.id
指對象的實例id
。您也可以通過在方法簽名上粘貼@property
裝飾器將其設置爲模型上的property
。
沒有試圖撕掉@JosvicZammit,但使用ContentType
這裏是錯誤的方法。這只是一個浪費的數據庫查詢。你可以從_meta
屬性的要求信息:
from django.core.urlresolvers 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準備:
from django.core.urlresolvers import reverse
reverse('admin:{0}_{1}_change'.format(self._meta.app_label, self._meta.model_name), args=(self.pk,))
更多關於這方面的Django管理站點文檔,reversing admin urls。
這給了相同的結果Josvic扎米特的片段,但沒有擊中數據庫:
from django.core import urlresolvers
from django.db import models
class MyModel(models.Model):
def get_admin_url(self):
return urlresolvers.reverse("admin:%s_%s_change" % (self._meta.app_label, self._meta.model_name), args=(self.id,))
'model_name'通過'model_name'更改attr'module_name'('module_name'未定義) – ppython
Django 1.8在Model的元對象中將'module_name'屬性重命名爲'model_name'。 代碼片段更新...謝謝! –
因此,結合由克里斯,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,))
這些答案似乎並沒有工作。我剛回來「/ admin/tracker/order/2 /」。我如何獲取主機名? – Greg
@Greg當然,上面的'get_admin_url()'可以讓你看到主機名後的部分。使用Django [站點](https://docs.djangoproject.com/en/dev/ref/contrib/sites/)框架來適當地獲取當前站點的主機名。然後將其前綴爲'get_admin_url()'的結果。 –
在1.8中也能正常工作 – GergelyPolonkai