新しいモデルインスタンスが保存されたときにユーザーにメールを送信しようとしていますが、そのモデルインスタンスの管理ページへのリンクをメールに含める必要があります。正しいURLを取得する方法はありますか?Djangoにはその情報がどこかに保存されている必要があると思います。
5 に答える
@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,))
この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
編集:以下のChris Prattによる回答は、テーブル上にDBクエリを保存しContentType
ます。instance._meta
私の答えはまだ「機能」しており、Djangoモデルの内部にあまり依存していません。ご参考までに。
これにより、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,))
Python3にも対応しているこの1つのライナーを使用するだけです。
from django.urls import reverse
reverse('admin:{0}_{1}_change'.format(self._meta.app_label, self._meta.model_name), args=(self.pk,))
詳細については、django管理サイトのドキュメントで管理URLを逆にしてください。
したがって、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,))