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)。
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で約束されていたすべての良さが機能し始めました。
URLリゾルバーをテンプレートで直接使用できます。独自のフィルターを作成する必要はありません。例えば。
{% url 'admin:index' %}
{% url 'admin:polls_choice_add' %}
{% url 'admin:polls_choice_change' choice.id %}
{% url 'admin:polls_choice_changelist' %}
参照: ドキュメント
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のソリューションに似ています。
新しいバージョンには別の方法があります。たとえば、 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>
opts
はmymodelinstance._meta
またはMyModelClass._meta
のようなものです
1つの落とし穴は、Djangoテンプレート({{ myinstance._meta }}
など)のアンダースコア属性に直接アクセスできないため、ビューからopts
オブジェクトをテンプレートコンテキストとして渡す必要があることです。
マイク・ラミレスの答えと本質的に同じですが、スタイルがより単純で、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])
1.1より前のDjangoは簡単です(デフォルトの管理サイトインスタンス用):
reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))
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を読み込むことを忘れないでください)
式を次のように変更することでこれを解決しました。
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'),
動作しているように見えますが、そのクリーンさはわかりません。
モデルを使用する別のオプションを次に示します。
基本モデルを作成します(または単に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()