2012-05-02 131 views
22

首先,感謝您閱讀我的問題。Django - 如何從模型實例獲取管理網址

我想在保存新模型實例時向用戶發送電子郵件,並且我希望電子郵件包含指向該模型實例的管理頁面的鏈接。有沒有辦法獲得正確的網址?我認爲Django必須將這些信息存儲在某個地方。

回答

26

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

+0

這些答案似乎並沒有工作。我剛回來「/ admin/tracker/order/2 /」。我如何獲取主機名? – Greg

+0

@Greg當然,上面的'get_admin_url()'可以讓你看到主機名後的部分。使用Django [站點](https://docs.djangoproject.com/en/dev/ref/contrib/sites/)框架來適當地獲取當前站點的主機名。然後將其前綴爲'get_admin_url()'的結果。 –

+1

在1.8中也能正常工作 – GergelyPolonkai

33

沒有試圖撕掉@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,)) 
+5

如果您可以在註釋中有效地做代碼示例,這將是一個絕對的混亂。我注意到喬斯維克有答案,他得到了信任,所以,沒有冒犯,但真的不知道爲什麼你應該照顧差不多一年後的事實。 –

4

只需使用這一個班輪,這也是巨蟒-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

+0

應該是'self._meta.model_name'而不是'self._meta.module_name'。 – nedned

+0

謝謝@nedned,修復 – radtek

+0

僅僅因爲它是可能的: 'reverse('admin:{m.app_label} _ {m.model_name} _change'.format(m = self._meta),args = [self.pk]) ' – batisteo

7

這給了相同的結果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,)) 
+0

'model_name'通過'model_name'更改attr'module_name'('module_name'未定義) – ppython

+1

Django 1.8在Model的元對象中將'module_name'屬性重命名爲'model_name'。 代碼片段更新...謝謝! –

2

因此,結合由克里斯,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,))