2010-06-30 17 views
12

Recientemente me actualicé a Django 1.2.1 porque estaba específicamente interesado en la capacidad de have basic many-to-many inline fields. Cuando se utiliza el administrador de este modo:Administrador en línea de Django 1.2.1 para muchos a muchos campos

modelos iniciales:

class Ingredient(models.Model): 
    name = models.TextField() 

class Recipe(models.Model): 
    ingredients = models.ManyToManyField(Ingredient) 

administrador inicial:

class IngredientInline(admin.TabularInline): 
     model = Recipe.ingredients.through 

class RecipeOptions(admin.ModelAdmin): 
    inlines = [IngredientInline,] 
    exclude = ('ingredients',) 

admin.site.register(Recipe,RecipeOptions)   

Lo que obtuve fue la misma forma que normalmente ver en un campo ManyToMany, con un poco de sobrepeso filas Suministrarle parámetros adicionales como un Modelo de Modelo de Ingredientes no ayudó. Sospechando que algo podría estar mal con las asociaciones básicas de ModelForm a través del modelo = Foo.manyfields.through, decidí ver si un modelo de intermediario ayudaría. Ahora se muestra un formulario en línea de trabajo a través de:

nuevos modelos:

class RecipeJoin(models.Model): 
    pass 

class Recipe(models.Model): 
    ingredients = models.ManyToManyField(RecipeJoin,through='Ingredient') 

class Ingredient(models.Model): 
    name = models.TextField() 
    test = models.ForeignKey(RecipeJoin,null=True,blank=True,editable=False) 

Nueva administrador:

class IngredientInline(admin.TabularInline): 
    model = Recipe.ingredients.through 

class RecipeOptions(admin.ModelAdmin): 
    inlines = [IngredientInline,] 

admin.site.register(Recipe,RecipeOptions) 

Obviamente, esto no es un truco que me gustaría utilizar. ¿Alguien sabe de una manera de obtener una relación manytomany para mostrar a través de formulario en línea sin (a) crear un formulario y plantilla BasicInline completamente nuevo o (b) ponerlo a través de un modelo de intermediario (o administrador genérico)?

TIA. (Me disculpo por la verbosidad, es mi primer mensaje, así que quería ser exhaustivo).

Respuesta

23

¿Realiza uno de estos ejemplos lo que intenta hacer?

a:

# Models: 

class Ingredient(models.Model): 
    name = models.CharField(max_length=128) 

class Recipe(models.Model): 
    name = models.CharField(max_length=128) 
    ingredients = models.ManyToManyField(Ingredient, through='RecipeIngredient') 

class RecipeIngredient(models.Model): 
    recipe = models.ForeignKey(Recipe) 
    ingredient = models.ForeignKey(Ingredient) 
    amount = models.CharField(max_length=128) 


# Admin: 

class RecipeIngredientInline(admin.TabularInline): 
    model = Recipe.ingredients.through 

class RecipeAdmin(admin.ModelAdmin): 
    inlines = [RecipeIngredientInline,] 

class IngredientAdmin(admin.ModelAdmin): 
    pass 

admin.site.register(Recipe,RecipeAdmin) 
admin.site.register(Ingredient, IngredientAdmin) 

b:

# Models: 

class Recipe(models.Model): 
    name = models.CharField(max_length=128) 

class Ingredient(models.Model): 
    name = models.CharField(max_length=128) 
    recipe = models.ForeignKey(Recipe) 


# Admin: 

class IngredientInline(admin.TabularInline): 
    model = Ingredient 

class RecipeAdmin(admin.ModelAdmin): 
    inlines = [IngredientInline,] 

admin.site.register(Recipe,RecipeAdmin) 
+0

Sí, finalmente decidí conformarme con un ForeignKey, pero en realidad estaba buscando una forma en línea que funcionara con un campo ManyToMany como parece indicar la documentación de django 1.2 ... Aún así, ambos funcionan, ¡así que gracias! – Katharine

0

Si recuerdo correctamente (y ha pasado un tiempo desde que hice esta parte), debe agregar el administrador de Ingredient y configurarlo para que tenga el ModelForm personalizado. Entonces ese formulario se usará en la versión en línea de Ingredient.

+0

Eso es lo que pensaba así, pero lo probé y tengo la misma lista de menús desplegables. Muy raro. – Katharine

Cuestiones relacionadas