2010-06-30 17 views
12

मैंने हाल ही में Django 1.2.1 में अपग्रेड किया क्योंकि मुझे विशेष रूप से have basic many-to-many inline fields की क्षमता में रूचि थी।कई लोगों के लिए 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 मैदान पर देखना होगा एक ही रूप था, पंक्तियों। एक संघटक मॉडलफॉर्म जैसे अतिरिक्त पैरामीटर के साथ इसे आपूर्ति करने में मदद नहीं मिली। संदेह है कि मूल मॉडलफॉर्म एसोसिएशन के साथ मॉडल = 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 फॉर्म और टेम्पलेट या (बी) इसे मध्यस्थ (या सामान्य व्यवस्थापक) मॉडल के माध्यम से डालने के बिना?

टीआईए। (मैं verbosity के लिए माफी माँगता हूँ, यह मेरी पहली पोस्ट है इसलिए पूरी तरह से होना चाहता था)।

उत्तर

23

क्या इन उदाहरणों में से कोई एक ऐसा करने के लिए प्रयास कर रहा है जिसे आप करने की कोशिश कर रहे हैं?

एक:

# 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

हां, मैंने अंततः एक विदेशीकी के लिए बसने का फैसला किया, लेकिन मैं वास्तव में एक इनलाइन फॉर्म की तलाश में था जो कई लोगों के साथ काम करेगा क्योंकि django 1.2 दस्तावेज कहता है ... फिर भी, इन दोनों कामों में, धन्यवाद! – Katharine

0

अगर मुझे सही याद है (और यह कुछ समय हो गया है क्योंकि मैंने यह हिस्सा किया है), तो आपको एग्रीडेंट के लिए व्यवस्थापक जोड़ना होगा और कस्टम मॉडलफॉर्म स्थापित करना होगा। फिर उस फॉर्म का उपयोग Ingredient के इनलाइन संस्करण में किया जाएगा।

+0

है यही कारण है कि मैं भी सोचा, लेकिन मैं इसे करने की कोशिश की और ड्रॉप-डाउन की एक ही सूची मिल गया। बहुत अजीब। – Katharine

संबंधित मुद्दे