Django 1.2.1 Inline Admin for Many To Many Fields

Обновить

December 2018

Просмотры

12.4k раз

12

Я недавно обновлен до 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)        

То, что я получил ту же форму вы обычно видите на поле ManyToMany, с некоторыми дополнительными рядами. Поставляя его с дополнительными параметрами, как ингредиент ModelForm не помогло. Подозревая, что-то не так с основными ассоциациями ModelForm через модель = 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)

Очевидно, что это не хак, я хотел бы использовать. Любой знают способ получить manytomany отношения, чтобы отобразить с помощью встроенной формы либо без (а) создания совершенно новая формы BasicInline и шаблона или (б) положить его через посредник (или общие администратор) модели?

ТИА. (Прошу прощения за многословие, это мой первый пост так хотел быть тщательно).

2 ответы

0

Если я правильно помню (и это было временем, так как я сделал эту часть), вам нужно добавить администратор для ингредиента и установить его, чтобы иметь собственный ModelForm. Затем эта форма будет использоваться в инлайн версии ингредиента.

24

Есть один из этих примеров выполнить то, что вы пытаетесь сделать?

а:

# 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)

б:

# 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)