La configuración admin filter_horizontal
de Django ofrece un buen widget para editar una relación de muchos a muchos. Pero es una configuración especial que quiere una lista de campos, por lo que solo está disponible en el modelo (administrador para) que define el ManyToManyField
; ¿Cómo puedo obtener el mismo widget en el (administrador para) otro modelo, leyendo la relación al revés?¿Cómo acceder a ambas direcciones de ManyToManyField en Django Admin?
Mis modelos se parecen a esto (no dude en hacer caso omiso de la complicación User
/UserProfile
, es el caso de uso real, aunque):
class Site(models.Model):
pass
class UserProfile(models.Model):
user = models.OneToOneField(to=User,unique=True)
sites = models.ManyToManyField(Site,blank=True)
yo puede conseguir un widget agradable en la forma de administración para UserProfile
con
filter_horizontal = ('sites',)
pero no puedo ver cómo obtener el equivalente en el administrador Site
.
también puedo conseguir parte vías mediante la adición de una línea de SiteAdmin
, definida como:
class SiteAccessInline(admin_module.TabularInline):
model = UserProfile.sites.through
Es rotonda y poco manejable sin embargo; el widget no es en absoluto intuitivo para simplemente administrar la relación de muchos a muchos.
Por último, hay un truco described here que implica la definición de otra ManyToManyField
en Site
y asegurarse de que apunta a la misma tabla de base de datos (y saltar a través de unos aros porque Django no es realmente diseñado para tener diferentes campos en diferentes modelos que describen la misma datos). Espero que alguien me pueda mostrar algo más limpio.
¡Muchas gracias! :-D – Neal
¿Alguien sabe de una versión actualizada de esta idea que está actualizada para django 1.4? Por un lado, el error se ha corregido (en los últimos dos años), y para el caso, no estoy seguro de por qué el alcance de SiteAdmin debe tener alguna idea de lo que significa user_profiles. Y de hecho, actualmente estoy recibiendo el error Tipo de excepción: \t ImproperlyConfigured Excepción Valor: \t 'HospitalAdmin.fields' se refiere al campo '' USER_PROFILES que falta de la forma. Por supuesto, los nombres de modelo son diferentes, pero la estructura es la misma. Hospital = Sitio. –