2011-03-16 7 views
10

Tengo un modelo expuesto en el administrador de Django, que usa la lista readonly_fields de ModelAdmin para mostrar un campo "usuario", que es un enlace ForiegnKey al modelo de usuario de Django. De forma predeterminada, readonly_fields hace que este campo se represente como texto simple que contiene el correo electrónico del usuario (por ejemplo, [email protected]). ¿Cómo cambiaría esto para que se muestre como un enlace a la página de administración asociada para ese usuario? (Por ejemplo, <a href="/admin/auth/user/123/">[email protected]</a>)Haciendo Django Readonly ForeignKey Campo en Admin Render como un enlace

Respuesta

33

Explorando el código fuente, encontré que esencialmente puede definir sus propios campos como métodos dentro de su subclase ModelAdmin, y puede hacer que el campo se represente como un enlace simplemente devolviendo el enlace html del método .

p. Ej.

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

Esto está realmente documentado, aunque indirectamente: la sección para 'readonly_fields' dice que" se comporta casi idéntica a ModelAdmin.list_display ", con un enlace a' list_display' donde se define la opción de método personalizado. –

+6

Haz '' user_link.allow_tags = True'' en lugar de mark_safe y luego este método también funciona en la lista de cambios. –

+0

Si está enlazando a otro tipo, generalmente es 'urlresolvers.reverse ('admin: _ _change', ...)'. Reemplace y con las cadenas apropiadas. – Seth

1

respuesta de Cerin no funciona en mi proyecto Django 1.8, porque readonly_fields no deben contener cadena 'USER_LINK', sino una referencia a la función definida:

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',) 

Tenga en cuenta que el usuario (obj) anula tanto edición de modelo único y lista de modelos para el campo Profile.user. Tenga en cuenta también que readonly_fields utiliza tanto el usuario como el "usuario", uno representa el correo electrónico vinculado, otro nombre de usuario.

Cuestiones relacionadas