旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[Django] 管理サイトでオブジェクトにリンク

2013年1月2日

UserProfileのChangeListからUserにリンクを貼りたい場合

from django.contrib import admin
from django.core.urlresolvers import reverse
from accounts.models import UserProfile

class UserProfileAdmin(admin.ModelAdmin):
    def subactions(self, obj):
        return u'''<a href="%s">Change User</a>''' % (
            reverse('admin:auth_user_change', args=(obj.user.id,)),
        )
    subactions.allow_tags = True 
    subactions.short_description = u'Actions'
admin.site.register(UserProfile, UserProfileAdmin)

Djangoバージョンは1.4.3

管理サイトのURL名一覧

該当部分のコピペ

django/contrib/admin/site.py

# Admin-site-wide views.
urlpatterns = patterns('',
    url(r'^$',
        wrap(self.index),
        name='index'),
    url(r'^logout/$',
        wrap(self.logout),
        name='logout'),
    url(r'^password_change/$',
        wrap(self.password_change, cacheable=True),
        name='password_change'),
    url(r'^password_change/done/$',
        wrap(self.password_change_done, cacheable=True),
        name='password_change_done'),
    url(r'^jsi18n/$',
        wrap(self.i18n_javascript, cacheable=True),
        name='jsi18n'),
    url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$'
        wrap(contenttype_views.shortcut)),
    url(r'^(?P<app_label>\w+)/$',
        wrap(self.app_index),
        name='app_list')
)

django/contrib/admin/options.py

urlpatterns = patterns('',
    url(r'^$',
        wrap(self.changelist_view),
        name='%s_%s_changelist' % info
    url(r'^add/$',
        wrap(self.add_view),
        name='%s_%s_add' % info),
    url(r'^(.+)/history/$',
        wrap(self.history_view),
        name='%s_%s_history' % info),
    url(r'^(.+)/delete/$',
        wrap(self.delete_view),
        name='%s_%s_delete' % info),
    url(r'^(.+)/$',
        wrap(self.change_view),
        name='%s_%s_change' % info),
)

下の方は、アプリ名とモデル名から動的に名前が変わります
例えば、django.contrib.authアプリのユーザ情報ならこうなる

reverse('auth_user_changelist')
reverse('auth_user_add')
reverse('auth_user_history', args=(id,))
reverse('auth_user_delete', args=(id,))
reverse('auth_user_change', args=(id,))

蛇足

aタグをベタ打ちしたくないんだけど、どうすりゃいいんだろう?