2010-06-30 27 views
12

我最近升級到了Django 1.2.1,因爲我對have basic many-to-many inline fields的能力有特別的興趣。當使用像這樣的管理:Django 1.2.1多行到多行的內聯管理

初始模型:

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

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

初始管理員:

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

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

admin.site.register(Recipe,RecipeOptions)   

我得到了什麼是相同的形式,你會在多對多場通常會看到,有一些額外的行。使用諸如Ingredient ModelForm之類的額外參數提供它並沒有幫助。懷疑基本的ModelForm關聯可能會出現問題,通過model = Foo.manyfields.through,我決定看看中介模型是否有幫助。

新型號:現在通過顯示一個工作直列形式

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) 

新的管理:

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

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

admin.site.register(Recipe,RecipeOptions) 

顯然,這不是一個黑客,我想用。任何人都知道如何通過內聯表單來顯示多種關係的方式,而不需要(a)創建全新的BasicInline表單和模板,或者(b)通過中介(或通用管理員)模型進行創建。

TIA。 (我爲詳細道歉,這是我的第一篇文章,所以想徹底)。

回答

23

這些例子中的一個能夠完成你正在做的事情嗎?

一個:

# 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

是的,我最終決定解決一個ForeignKey,但我實際上正在尋找一個內聯的表單,可以與一個ManyToMany字段一起工作,因爲django 1.2文檔似乎說...儘管如此,這兩個工作,謝謝! – Katharine 2010-07-06 02:29:14

0

如果我沒有記錯(自從完成這部分工作已經有一段時間了),您需要添加用於Ingredient的管理員並將其設置爲具有自定義的ModelForm。然後,該表單將用於Ingredient的內聯版本。

+0

這就是我認爲是很好,但我試了一下,得到的下拉菜單中相同的列表。很奇怪。 – Katharine 2010-07-01 15:32:42