210

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

基本的に、ビュー名が次のURLリバース機能を使用していました'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)。

4

9 に答える 9

486

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

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

参照:ドキュメント

于 2010-05-28T15:22:17.307 に答える
115
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__())

これはurl namespacesを使用する点を除いて hansen_j のソリューションに似ています。admin: は管理者のデフォルトのアプリケーション名前空間です。

于 2009-11-12T09:17:32.700 に答える
65

電話をかけようとすると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ドキュメントで約束されたすべての利点が機能し始めました。

于 2009-05-11T21:40:14.190 に答える
19

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

于 2014-07-17T14:34:17.320 に答える
17

マイク・ラミレスの答えと本質的に同じですが、よりシンプルで文体がジャンゴの標準的なget_absolute_url方法に近いです:

from django.urls import reverse

def get_admin_url(self):
    return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name),
                   args=[self.id])
于 2016-05-06T19:06:22.007 に答える
15

1.1 より前の django の場合は単純です (デフォルトの管理サイト インスタンスの場合):

reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))
于 2009-03-29T11:44:56.433 に答える
3

式を次のように変更してこれを解決しました。

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'),

動作しているようですが、そのクリーン度はわかりません。

于 2009-03-29T11:38:15.250 に答える
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 をロードすることを忘れないでください)。

于 2009-07-17T01:23:39.337 に答える
-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()
于 2010-08-03T15:14:12.383 に答える