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