web-dev-qa-db-ja.com

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

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

基本的に、ビュー名を'Django.contrib.admin.views.main.change_stage'にしてURLリバース関数を使用していました

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)。

153
hasen

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で約束されていたすべての良さが機能し始めました。

59
bskinnersf

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

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

参照: ドキュメント

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

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

93
Mike Ramirez

新しいバージョンには別の方法があります。たとえば、 1.1

{% 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>

optsmymodelinstance._metaまたはMyModelClass._metaのようなものです

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

13
Anentropic

マイク・ラミレスの答えと本質的に同じですが、スタイルがより単純で、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])
10

1.1より前のDjangoは簡単です(デフォルトの管理サイトインスタンス用):

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

1.0を使用している場合は、次のようなカスタムtemplatetagを作成してください。

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を読み込むことを忘れないでください)

3
DarwinSurvivor

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

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

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

1
hasen

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

基本モデルを作成します(または単に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()
0
Ian Cohen