web-dev-qa-db-ja.com

Django-モデルインスタンスから管理URLを取得する方法

新しいモデルインスタンスが保存されたときにユーザーにメールを送信しようとしていますが、そのモデルインスタンスの管理ページへのリンクをメールに含めたいと思います。正しいURLを取得する方法はありますか? Djangoはその情報がどこかに保存されている必要があります。

29
Greg

これ 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デコレータを貼り付けることで、モデルで property として設定することもできます。

32

@JosvicZammitをぼったくりしようとはしていませんが、ここではContentTypeを使用するのは間違ったアプローチです。これは無駄なDBクエリです。 _meta属性からrequire情報を取得できます。

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,))
42
Chris Pratt

これにより、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,))
8
Mario Orlandi

python 3対応のこの1つのライナーを使用するだけです:

from Django.urls import reverse

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

これについて詳しくは、Django admin site doc、 reversing admin urls

6
radtek

したがって、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,))
3
metakermit