2009-08-27 47 views
11

En mi models.py que tengo algo así como:¿Cómo agregar campos multitracionales manytomany en django admin?

class LocationGroup(models.Model): 
    name = models.CharField(max_length=200) 

class Report(models.Model): 
    name = models.CharField(max_length=200) 
    locationgroups = models.ManyToManyField(LocationGroup) 

admin.py (estándar):

admin.site.register(LocationGroup) 
admin.site.register(Report) 

Cuando entro en la página de administración para el informe, se muestra un bonito campo de opción múltiple. ¿Cómo puedo agregar el mismo campo de opción múltiple en LocationGroup? Puedo tener acceso a todos los informes llamando LocationGroup.report_set.all()

+0

entradas relacionadas: https://code.djangoproject.com/ticket/897 – guettli

Respuesta

8

La solución que encontré fue seguir las instrucciones para ManyToManyFields with intermediary models. Aunque no esté utilizando la función de modelo 'directo', simplemente finja como si lo fuera y cree un modelo de código auxiliar con la ForeignKey necesaria.

# models: make sure the naming convention matches what ManyToManyField would create 
class Report_LocationGroups(models.Model): 
    locationgroup = models.ForeignKey(LocationGroup) 
    report = models.ForeignKey(Report) 

# admin 
class ReportInline(admin.TabularInline): 
    model = models.Report_LocationGroups 

class LocationGroupAdmin(admin.ModelAdmin): 
    inlines = ReportInline, 
+1

Parece la implementación más fácil relativa, ¡gracias! –

+0

Más fácil, pero sigue siendo un truco. Ojalá Django pudiera soportar esto de una manera más elegante. –

2

Creo Yon puede combinar este código de ejemplo (source) se rompe wich SYNC_DB

class ItemType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    description = meta.CharField(maxlength=250) 
    properties = meta.ManyToManyField('PropertyType', 
      db_table='app_propertytype_itemtypes') 

class PropertyType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    itemtypes = meta.ManyToManyField(ItemType) 

con this snippet

class ManyToManyField_NoSyncdb(models.ManyToManyField): 
    def __init__(self, *args, **kwargs): 
     super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs) 
     self.creates_table = False 

para obtener algo así como

class ItemType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    description = meta.CharField(maxlength=250) 
    properties = meta.ManyToManyField_NoSyncdb('PropertyType', 
      db_table='app_propertytype_itemtypes') 

class PropertyType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    itemtypes = meta.ManyToManyField(ItemType) 

Negación: esto es sólo una idea aproximada

Editar: Probablemente hay calle detrás que ver con Django's 1.1 Proxy Models

1

Creo que lo que se está buscando es admin inlines. En su admin.py usted desea agregar algo como esto:

class LocationGroupInline(admin.TabularInline): 
    model = LocationGroup 

class ReportAdmin(admin.ModelAdmin): 
    inlines = [ LocationGroupInline, ] 
admin.site.register(Report, ReportAdmin) 
admin.site.register(LocationGroup) 

hay muchas opciones para incluir en LocationGroupInline si desea seguir configurando la pantalla en línea del modelo relacionado. Dos de estas opciones son del formulario y formset, que le permitirán usar clases personalizadas de Formulario y Formulario Django para personalizar aún más la apariencia del administrador del modelo en línea. Al usar esto, puede crear un formulario simple que muestre solo el campo de opción múltiple que desea (a excepción de un campo M2M, no será posible mostrarlo como un solo menú desplegable, sino como un cuadro de selección múltiple). Por ejemplo:

class MyLocationGroupForm(forms.Form): 
    location = forms.MultipleModelChoiceField(
      queryset=LocationGroup.objects.all()) 

class LocationGroupInline(admin.TabularInline): 
    model = LocationGroup 
    form = MyLocationGroupForm 
+1

Informe de administrador tendrá LocationGroups inline por defecto, la pregunta era cómo hacerlo a la inversa. De todos modos, esto generará una excepción que LocationGroup no tenga ForeignKey para ReportAdmin. –

Cuestiones relacionadas