Создание Django Readonly ForeignKey Field в Admin Render как ссылка

У меня есть модель, представленная в Django admin, которая использует список ModelAdmin readonly_fields, чтобы показать поле пользователя, которое является ForiegnKey, связанным с моделью Django User. По умолчанию readonly_fields заставляет это поле отображаться как простой текст, содержащий адрес электронной почты пользователя (например, [email protected]). Как я могу изменить это для рендеринга как ссылку на связанную страницу администратора для этого пользователя? (например, <a href="/admin/auth/user/123/">[email protected]</a>)

Ответ 1

Копаясь в исходном коде, я обнаружил, что вы можете по существу определить свои собственные поля как методы в вашем подклассе ModelAdmin, и вы можете получить поле для визуализации в виде ссылки, просто вернув ссылку html из метода.

например.

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'

Ответ 2

Ответ 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',)

Обратите внимание, что пользователь (obj) переопределяет отображение одной модели и отображение списка моделей для поля Profile.user. Также обратите внимание, что readonly_fields использует пользователя и "пользователь", один передает связанное электронное письмо, другое имя пользователя.