Создание поля Django только для чтения ForeignKey в Admin Render в качестве ссылки - PullRequest
10 голосов
/ 16 марта 2011

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

Ответы [ 2 ]

34 голосов
/ 16 марта 2011

Копаясь в исходном коде, я обнаружил, что вы можете по сути определить свои собственные поля как методы в своем подклассе 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'
1 голос
/ 02 июля 2015

Ответ 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 использует и пользователя, и пользователя, один отображает связанную электронную почту, другой - имя пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...