Подтвердить что ты не робот

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) переноса ее через посредническую (или общую админ) модель?

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

4b9b3361

Ответ 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. Затем эта форма будет использоваться во встроенной версии Ингредиента.