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
10
A
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'
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
- 1. Búsqueda textual del campo ForeignKey en Django Admin
- 2. ForeignKey vs OneToOne campo django
- 3. Django-Admin: CharField como TextArea
- 4. herencia Django con el campo ForeignKey
- 5. cambiar lista mostrar enlace en django admin
- 6. SqlAlchemy - Filtrado por campo definido como ForeignKey
- 7. Personalizar Django admin Campo predeterminado de TabularInline
- 8. Django admin - Exportar como CSV
- 9. personalizar seleccionar en django admin
- 10. Django - ForeignKey nula
- 11. Django foreignkey get_or_create
- 12. búsqueda inversa Django por ForeignKey
- 13. filtro de campo ForeignKey de administración de Django
- 14. Django: Admin: cambiar el widget del campo en administración
- 15. WMD en Django Admin?
- 16. Validación de campo Django en Modelo y en Admin?
- 17. En Django Admin, ¿cómo desactivo el enlace Eliminar
- 18. Django ForeignKey _set en un modelo heredado
- 19. Reemplazar el mensaje "este campo es obligatorio" en django admin
- 20. Guardar Django ModelForm con ForeignKey
- 21. Creando un campo de solo lectura en Django Admin, basado en el valor de otro campo
- 22. Sinatra Web Admin (como administrador de Django)
- 23. Django admin, ocultar + signo más en campo de clave externa
- 24. Django ForeignKey creado vacío?
- 25. de entrada de forma libre para ForeignKey campo en un Django ModelForm
- 26. Django ForeignKey contiene consulta
- 27. Formularios dinámicos en django-admin
- 28. Funcionalidad emergente Django Admin
- 29. Autor automático en Django admin
- 30. Django: definir un nombre para ForeignKey inversa
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. –
Haz '' user_link.allow_tags = True'' en lugar de mark_safe y luego este método también funciona en la lista de cambios. –
Si está enlazando a otro tipo, generalmente es 'urlresolvers.reverse ('admin: _ _change', ...)'. Reemplace y con las cadenas apropiadas. –
Seth