2012-05-02 19 views
22

まず、私の質問を読んでくれてありがとう。Django - モデルインスタンスから管理URLを取得する方法

新しいモデルインスタンスが保存されたときにメールを送信しようとしています。そのモデルインスタンスの管理ページへのリンクをメールに追加します。正しいURLを取得する方法はありますか?私は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 [sites](https://docs.djangoproject.com/en/dev/ref/contrib/sites/)フレームワークを使用します。そして、 'get_admin_url()'の結果に接頭辞を付けます。 –

+1

1.8でもうまく動作します – GergelyPolonkai

33

@JosvicZammitを取り除こうとしていませんが、ContentTypeを使用しているのは間違ったアプローチです。これは無駄なDBクエリです。

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

だけでも、Pythonの3準備ができている。この1つのライナーを使用します:Djangoのadminサイトのドキュメント、reversing admin urlsにこの上

from django.core.urlresolvers import reverse 

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

もっとあなたは_meta属性からの情報を必要とし得ることができます。

+0

'self._meta.module_name'ではなく' self._meta.model_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'によって変更attr 'module_name'(' module_name'は定義されていません) – ppython

+1

Django 1.8はModelのメタオブジェクトの 'model_name'属性を 'model_name'に変更しました。 コードスニペットが更新されました...ありがとうございます! –

2

だから、クリス、Josvicとジョシュで答えを組み合わせることで、ここであなたに追加することができ、コピー&ペーストの方法ですあなたのモデル(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,)) 
関連する問題