Python 使管理呈现中的Django只读ForeignKey字段作为链接

Python 使管理呈现中的Django只读ForeignKey字段作为链接,python,django,django-admin,Python,Django,Django Admin,我在Django的admin中公开了一个模型,它使用ModelAdmin的readonly_字段列表来显示“user”字段,这是一个链接到Django用户模型的ForiegnKey。默认情况下,readonly_字段会将此字段呈现为包含用户电子邮件的简单文本(例如someuser@domain.com)。如何将其更改为该用户的关联管理页面的链接?(例如,)深入研究源代码,我发现您基本上可以将自己的字段定义为ModelAdmin子类中的方法,只需从该方法返回链接html,就可以将字段呈现为链接 e

我在Django的admin中公开了一个模型,它使用ModelAdmin的readonly_字段列表来显示“user”字段,这是一个链接到Django用户模型的ForiegnKey。默认情况下,readonly_字段会将此字段呈现为包含用户电子邮件的简单文本(例如
someuser@domain.com
)。如何将其更改为该用户的关联管理页面的链接?(例如,

深入研究源代码,我发现您基本上可以将自己的字段定义为ModelAdmin子类中的方法,只需从该方法返回链接html,就可以将字段呈现为链接

e、 g

来自django.contrib导入管理
从django.utils.safestring导入标记_safe
从django.core导入URL解析程序
类MyModelAdmin(admin.ModelAdmin):
只读字段=['user\u link']
def用户链接(自身、obj):
change\u url=urlresolvers.reverse('admin:auth\u user\u change',args=(obj.user.id,))
返回标记安全(“”%(更改url,obj.user.email))
user\u link.short\u description='user'

Cerin的答案在我的Django 1.8项目中不起作用,因为只读字段不应包含字符串“user\u 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',)
class ProfileAdmin(admin.ModelAdmin):
# https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
def用户(obj):
change\u url=reverse('admin:auth\u user\u change',args=(obj.user.id,))
返回mark_safe(“”.format(更改url、obj.user.email))
user.short_description='编辑链接用户'
原始id字段=('user',)
列表显示=(用户、姓、名、专业化)
列表显示链接=('first\u name','last\u name',)
只读_字段=(用户,'用户',)

请注意,用户(obj)会覆盖Profile.user字段的单一模型编辑和模型列表显示。还请注意,只读字段同时使用用户和“用户”,一个显示链接的电子邮件,另一个显示用户名。

这实际上是有记录的,尽管是间接的:
readonly\u字段的部分称其“行为与ModelAdmin.list\u显示几乎相同”,使用指向定义自定义方法选项的
list\u display
的链接。执行
user\u link.allow\u tags=True
而不是标记\u safe,然后此方法也在变更列表中工作。如果您链接到另一种类型,则通常是
urlresolvers.reverse('admin:\u change',…)
。用适当的字符串替换和。优雅的解决方案:o)唯一的缺点是,对于默认的管理模板,所有只读字段都放在更改表单的底部。
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',)