2010-06-30 51 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