まず、私の質問を読んでくれてありがとう。Django - モデルインスタンスから管理URLを取得する方法
新しいモデルインスタンスが保存されたときにメールを送信しようとしています。そのモデルインスタンスの管理ページへのリンクをメールに追加します。正しいURLを取得する方法はありますか?私はDjangoがその情報をどこかに保存しなければならないと考えます。
まず、私の質問を読んでくれてありがとう。Django - モデルインスタンスから管理URLを取得する方法
新しいモデルインスタンスが保存されたときにメールを送信しようとしています。そのモデルインスタンスの管理ページへのリンクをメールに追加します。正しいURLを取得する方法はありますか?私はDjangoがその情報をどこかに保存しなければならないと考えます。
この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
として設定することもできます。
@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,))
コメント内のコードサンプルを効果的に実行できるのであれば、私は持っています。これは絶対的な混乱でした。私はジョスヴィッチが答えを持っていると言いました。彼はそれを信用していました。だから、犯行はありません。 –
だけでも、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
属性からの情報を必要とし得ることができます。
これは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,))
' model_name'によって変更attr 'module_name'(' module_name'は定義されていません) – ppython
Django 1.8はModelのメタオブジェクトの 'model_name'属性を 'model_name'に変更しました。 コードスニペットが更新されました...ありがとうございます! –
だから、クリス、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,))
これらの回答は機能していないようです。私はちょうど "/ admin/tracker/order/2 /"に戻ります。ホスト名を取得するにはどうすればよいですか? – Greg
@Gregもちろん、上記の 'get_admin_url()'はホスト名の後ろにある部分を取得します。現在のサイトのホスト名を適切に取得するには、Django [sites](https://docs.djangoproject.com/en/dev/ref/contrib/sites/)フレームワークを使用します。そして、 'get_admin_url()'の結果に接頭辞を付けます。 –
1.8でもうまく動作します – GergelyPolonkai