我在Django的管理员中有一个模型,它使用ModelAdmin的readonly_fields列表来显示一个“user”字段,这是一个链接到Django用户模型的ForiegnKey。默认情况下,readonly_fields会将此字段呈现为包含用户电子邮件的简单文本(例如someuser@domain.com
)。如何将其更改为呈现为该用户的关联管理页面的链接? (例如<a href="/admin/auth/user/123/">someuser@domain.com</a>
)
答案 0 :(得分:34)
深入研究源代码,我发现你基本上可以将自己的字段定义为ModelAdmin子类中的方法,只需从方法中返回链接html,就可以将字段呈现为链接。
e.g。
from django.contrib import admin
from django.utils.safestring import mark_safe
from django.core import urlresolvers
class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ['user_link']
def user_link(self, obj):
change_url = urlresolvers.reverse('admin:auth_user_change', args=(obj.user.id,))
return mark_safe('<a href="%s">%s</a>' % (change_url, obj.user.email))
user_link.short_description = 'User'
答案 1 :(得分:1)
Cerin的答案在我的Django 1.8项目中不起作用,因为readonly_fields不应该包含字符串'user_link',而是对定义函数的引用:
class ProfileAdmin(admin.ModelAdmin):
# https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
def user(obj):
change_url = reverse('admin:auth_user_change', args=(obj.user.id,))
return mark_safe('<a href="{0}">{1}</a>'.format(change_url, obj.user.email))
user.short_description = 'Edit linked user'
raw_id_fields = ('user',)
list_display = (user, 'last_name', 'first_name', 'specialization',)
list_display_links = ('first_name', 'last_name', ,)
readonly_fields = (user, 'user',)
请注意,user(obj)会覆盖Profile.user字段的单个模型编辑和模型列表显示。另请注意,readonly_fields同时使用用户和“用户”,一个使用链接的电子邮件,另一个用户名。