2010-06-30 13 views
12

Niedawno zaktualizowałem do Django 1.2.1, ponieważ byłem szczególnie zainteresowany zdolnością do have basic many-to-many inline fields. Podczas korzystania z administratorem w taki sposób:Django 1.2.1 Inline Admin dla wielu do wielu dziedzin

modeli początkowa:

class Ingredient(models.Model): 
    name = models.TextField() 

class Recipe(models.Model): 
    ingredients = models.ManyToManyField(Ingredient) 

Administrator początkowa:

class IngredientInline(admin.TabularInline): 
     model = Recipe.ingredients.through 

class RecipeOptions(admin.ModelAdmin): 
    inlines = [IngredientInline,] 
    exclude = ('ingredients',) 

admin.site.register(Recipe,RecipeOptions)   

Dostałem tę samą postać normalnie można zobaczyć na polu ManyToMany wraz z dodatkowymi wydziwianie. Dostarczenie jej dodatkowych parametrów, takich jak ModelForm Ingredient, nie pomogło. Podejrzewając, że coś może być nie tak z podstawowymi skojarzeniami ModelForm poprzez model = Foo.manyfields.through, zdecydowałem się sprawdzić, czy pośredni model pomógłby. Teraz wyświetla roboczy formularza inline poprzez:

nowe modele:

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) 

Nowy admin:

class IngredientInline(admin.TabularInline): 
    model = Recipe.ingredients.through 

class RecipeOptions(admin.ModelAdmin): 
    inlines = [IngredientInline,] 

admin.site.register(Recipe,RecipeOptions) 

Oczywiście nie jest to hack Chciałbym użyć. Ktoś wie, jak uzyskać wieloetniczną relację do wyświetlenia za pomocą formularza liniowego bez (a) utworzenia całkowicie nowego formularza i szablonu BasicInline lub (b) umieszczenia go za pośrednictwem modelu pośredniego (lub ogólnego administratora)?

TIA. (Przepraszam za gadatliwość, to mój pierwszy post, więc chciałem być dokładny).

Odpowiedz

23

Czy jeden z tych przykładów spełnia to, co próbujesz zrobić?

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) 
+0

Tak, ostatecznie zdecydowałem się zadowolić obcym kluczem, ale szukałem formularza wbudowanego, który działałby z polem ManyToMany, jak zdaje się mówić dokumentacja 1.2 Django ... Mimo to, obie te prace, więc dziękuję! – Katharine

0

Jeśli dobrze pamiętam (i minęło trochę czasu odkąd zrobiłem tę część), musisz dodać administratora dla składnika i ustawić go na niestandardowy ModelForm. Następnie ta forma zostanie użyta w wbudowanej wersji składnika.

+0

To co myślałem, jak również, ale ja spróbowałem i dostałem tę samą listę upadków spadek. Bardzo dziwne. – Katharine

Powiązane problemy