Django 1.2.1 Inline Admin для множества полей - PullRequest
12 голосов
/ 01 июля 2010

Я недавно обновился до 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, с некоторыми дополнительными строками.Предоставление дополнительных параметров, таких как 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)

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

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

Ответы [ 2 ]

24 голосов
/ 02 июля 2010

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

а:

# 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)
0 голосов
/ 01 июля 2010

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

...