Я недавно обновил до Django 1.2.1, потому что я конкретно интересовался способностью иметь основной many-many встроенные поля. При использовании администратора как так:
Первоначальные модели:
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 отношения отображаться через встроенную форму без любого (a) создания совершенно новой формы BasicInline и шаблона или без (b) проведения его через посредника (или без универсального администратора) модель?
TIA. (Я приношу извинения за многословие, это - мое первое сообщение так хотел быть полным).
Выполняет ли один из этих примеров то, что вы пытаетесь сделать?
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)
Если я правильно помню (а я уже давно не делал эту часть), вам нужно добавить администратора для Ingredient и установить для него настраиваемую ModelForm. Затем эта форма будет использоваться во встроенной версии Ingredient.