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