2010-06-30 5 views
12

Ho recentemente aggiornato a Django 1.2.1 perché ero interessato in particolare alla capacità di have basic many-to-many inline fields. Quando si utilizza l'amministrazione in questo modo:Django 1.2.1 Admin in linea per molti campi Molti

modelli iniziali:

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

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

amministratore iniziale:

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

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

admin.site.register(Recipe,RecipeOptions)   

Quello che ho ottenuto è stata la stessa forma che normalmente vedere su un campo ManyToMany, con qualche extra filari. Fornirlo con parametri extra come un ingrediente ModelForm non ha aiutato. Sospettando che qualcosa potrebbe essere sbagliato con le associazioni ModelForm di base tramite model = Foo.manyfields.through, ho deciso di vedere se un modello intermedio avrebbe aiutato. Ora mostra una forma in linea di lavoro attraverso:

Nuovi modelli:

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) 

nuovo admin:

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

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

admin.site.register(Recipe,RecipeOptions) 

Ovviamente questo non è un hack che vorrei utilizzare. Qualcuno sa di un modo per ottenere molte relazioni da visualizzare tramite il modulo in linea senza (a) creare un modulo e un modello BasicInline completamente nuovo o (b) metterlo attraverso un modello intermedio (o generico di amministrazione)?

TIA. (Mi scuso per la verbosità, è il mio primo post che voleva essere approfondito).

risposta

23

Uno di questi esempi realizza ciò che si sta tentando di fare?

un:

# 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ì, alla fine ho deciso di accontentarmi di un ForeignKey, ma in realtà stavo cercando un modulo in linea che avrebbe funzionato con un campo ManyToMany come sembra dire la documentazione di django 1.2 ... Comunque, entrambi funzionano, quindi grazie! – Katharine

0

Se ricordo correttamente (ed è passato un po 'di tempo da quando ho fatto questa parte), è necessario aggiungere l'admin per Ingredient e impostarlo per avere il ModelForm personalizzato. Quindi tale modulo verrà utilizzato nella versione inline di Ingredient.

+0

Questo è quello che ho pensato pure, ma ho provato e ho ottenuto lo stesso elenco di menu a discesa. Molto strano. – Katharine