オブジェクトのDjango管理URLを取得する


168

Django 1.0以前は、オブジェクトの管理URLを取得する簡単な方法があり、次のように使用する小さなフィルターを作成していました。 <a href="{{ object|admin_url }}" .... > ... </a>

基本的に私はビュー名が 'django.contrib.admin.views.main.change_stage'

reverse( 'django.contrib.admin.views.main.change_stage', args=[app_label, model_name, object_id] )

URLを取得します。

ご想像のとおり、私はDjangoの最新バージョンに更新しようとしていますが、これは私が遭遇した障害の1つであり、管理URLを取得するためのこのメソッドはもう機能しません。

django 1.0でこれを行うにはどうすればよいですか?(または私はsvnの最新バージョンに更新しようとしているので、それについては1.1)。

回答:


61

同様の問題があり、電話reverse('admin_index')をかけようとすると常にdjango.core.urlresolvers.NoReverseMatchエラーが発生しました。

urls.pyファイルに古い形式の管理URLが含まれていることがわかりました。

私は私のurlpatternsにこれを持っていました:

(r'^admin/(.*)', admin.site.root),

これは管理画面を機能させますが、非推奨の方法です。これを次のように変更する必要がありました。

(r'^admin/', include(admin.site.urls) ),

それを実行すると、Reversing Admin URLs docsで約束されたすべての良さが機能し始めました。


これで、ModelAdminのget_urls()メソッドが呼び出されないという問題が修正されました。ありがとう!
Arnaud、

8
この問題に対する最善のURL:docs.djangoproject.com/en/dev/ref/contrib/admin/...
ディンゴ

4
この「答え」は正しくありません。管理者アプリをアプリに適切に追加する方法を示しているだけで、作成者が抱えていた別の問題が解決されました。実際の質問に対する本当の答えは以下です-markmuetzから
Declan Shanaghy '19

また、モデルの管理インターフェースを登録しておく必要があります。そうしないと、URLは存在しません。
Flimm 2016

412

テンプレートで直接URLリゾルバーを使用できます。独自のフィルターを作成する必要はありません。例えば

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

{% url 'admin:polls_choice_change' choice.id %}

{% url 'admin:polls_choice_changelist' %}

参照:ドキュメント


1
markmuetz-これは公式のDjangoドキュメントのどこにありますか?(テンプレートで管理者の逆URLを使用する方法)?そうでない場合は、そうする必要があります。
ハッカー、

7
shacker-それはすべてドキュメントにあります... 1か所ではありません 「url」テンプレートタグはここに記載されています。「Django 1.1の新機能:」セクションのドキュメントでは、名前空間付きURLは問題ないと述べており、URL名前空間に関するセクションを示しています。これらすべてを組み合わせることで、テンプレートで管理アプリケーションを簡単に参照できます。注:返信を書いたとき、ドキュメントが異なっていたことを覚えています。
markmuetz

3
選択肢の「リスト」へのリンクを取得する方法を知っていますか?例:「{%url admin:polls_choice_add%}」が「/ admin / polls / choice / add」を与える場合、「/ admin / polls / choice」を与えるのと同じものは何ですか?
DarwinSurvivor

2
{%url admin:polls_choice_changelist%}は '/ admin / polls / choice' urlを返します
luc

35
管理URLの反転については、現在こちらで完全に文書化されていますhttps://docs.djangoproject.com/en/dev/ref/contrib/admin/#reversing-admin-urls
Josh Russo

101
from django.core.urlresolvers import reverse
def url_to_edit_object(obj):
  url = reverse('admin:%s_%s_change' % (obj._meta.app_label,  obj._meta.model_name),  args=[obj.id] )
  return u'<a href="%s">Edit %s</a>' % (url,  obj.__unicode__())

これはhansen_jのソリューションと似ていますがURL名前空間 admin:がadminのデフォルトのアプリケーション名前空間を使用する点が異なります。


3
よろしくお願いいたします。変更することの1つ:のargs=[object.pk]代わりにを使用しますargs=[object.id]。主キーフィールドの名前が以外の場合、より一般的なケースをカバーしていますid
2013年

5
いい答えだ。FYIより最近のジャンゴを使用して、誰もがobject._meta.model_nameにobject._meta.module_nameを変更する必要があります
Jagu

ジャンゴ初心者の皆さん、ありがとうございました。object._meta.app_label最終的には、django独自の認証アプリの名前を取得します。それはだauthたとえば、reverse(admin:auth_user_change, args=[object.id])変更のユーザーのページにジャンプする
GRET

2
必ずオブジェクトをobjに変更してください。この男は、予約済みの組み込みシンボルを上書きしています。
Kevin Parker

17

それ以降のバージョンには、たとえば1.10のような別の方法があります。

{% load admin_urls %}
<a href="{% url opts|admin_urlname:'add' %}">Add user</a>
<a href="{% url opts|admin_urlname:'delete' user.pk %}">Delete this user</a>

またはのoptsようなものはどこですかmymodelinstance._metaMyModelClass._meta

1つの問題は、Djangoテンプレート(など{{ myinstance._meta }})でアンダースコア属性に直接アクセスできないためopts、ビューからオブジェクトをテンプレートコンテキストとして渡す必要があることです。


2
ドキュメントのURLが変更されました!参照:docs.djangoproject.com/en/1.9/ref/contrib/admin/…–
Wim Feijen

12

基本的にMike Ramirezの回答と同じですが、スタイルがシンプルで、djangoの標準的なget_absolute_url方法に近いです。

def get_admin_url(self):
    return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name),
                   args=[self.id])

11

1.1以前のdjangoの場合は簡単です(デフォルトの管理サイトインスタンスの場合)。

reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))

8
新しいネームスペースでは、admin:%s_%s_change
Teebes、

3

1.0を使用している場合は、次のようなカスタムテンプレートタグを作成してみてください。

def adminpageurl(object, link=None):
    if link is None:
        link = object
    return "<a href=\"/admin/%s/%s/%d\">%s</a>" % (
        instance._meta.app_label,
        instance._meta.module_name,
        instance.id,
        link,
    )

次に、テンプレートで{%adminpageurl my_object%}を使用します(最初にtemplatetagをロードすることを忘れないでください)


1

私は式を次のように変更することでこれを解決しました:

reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )

これは、ルートURL confに「admin」URLハンドラーの名前があることを前提としています。主に、その名前は「django-admin」です。

つまり、ルートURLのconf:

url(r'^admin/(.*)', admin.site.root, name='django-admin'),

動作しているようですが、きれいかどうかはわかりません。


2
これは1.0では機能しますが、より良い解決策である1.1では機能しません。AlexKoshelevの回答を参照してください。
カールマイヤー

実際に試してみましたが、うまくいきませんでした。彼は1.0用だと言っていましたよね?
hasen 2009年

構文がURL名前空間の導入により1.1に変更されました: docs.djangoproject.com/en/dev/topics/http/urls/...
sleepyjames

-1

モデルを使用する別のオプションを次に示します。

基本モデルを作成する(または特定のモデルにadmin_linkメソッドを追加するだけ)

class CommonModel(models.Model):
    def admin_link(self):
        if self.pk:
            return mark_safe(u'<a target="_blank" href="../../../%s/%s/%s/">%s</a>' % (self._meta.app_label,
                    self._meta.object_name.lower(), self.pk, self))
        else:
            return mark_safe(u'')
    class Meta:
        abstract = True

その基本モデルから継承

   class User(CommonModel):
        username = models.CharField(max_length=765)
        password = models.CharField(max_length=192)

テンプレートで使用する

{{ user.admin_link }}

または表示

user.admin_link()

2
これは良い解決策ではないと思います。文字列フォーマットでURLを作成するのは悪い習慣です。reverse()を使用してください。
guettli 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.