2012-02-17 22 views
5

में लिस्टफ़ील्ड का प्रतिनिधित्व करने के लिए एक इनलाइन को कार्यान्वित करना क्या किसी सूचीसूची में एम्बेडेड मॉडल का प्रतिनिधित्व करने के लिए Django व्यवस्थापक से इनलाइन रिलेशनल आइटम्स के समान कुछ उपयोग करना संभव है?Django-nonrel

उदाहरण के लिए, मैं निम्नलिखित मॉडल मिल गया है:

class CartEntry(model.Model): 
    product_name=model.CharField(max_length=20) 
    quantity = model.IntegerField() 

class Cart(model.Model): 
    line_items = ListField(EmbeddedModelField('CartEntry')) 

मैं मानक इनलाइन किए जाने वाले उपयोग करने की कोशिश की है, लेकिन मैं जानता हूँ कि यह सही नहीं है:

class CartEntryInline(admin.StackedInline): 
    model=CartEntry 

class CartAdmin(admin.ModelAdmin) 
    inlines=[CartEntryInline] 

लेकिन जाहिर है कि 'नहीं करता है टी काम नहीं है, क्योंकि कोई विदेशी कुंजी संबंध नहीं है। क्या django-nonrel में ऐसा करने का कोई तरीका है?

उत्तर

0

बॉक्स से बाहर करना इतना आसान नहीं है। आपको Django के व्यवस्थापक मॉड्यूल में ListField और एंबेडेड मॉडेलफ़िल्फ़ प्रकार फ़ील्ड प्रबंधित करने और इसे करने के लिए कुछ हैकिंग करने की आवश्यकता होगी। आप दो भागों को लागू करना होगा:

Use EmbeddedModelField in Django's admin

आप एक वर्ग है कि EmbeddedModelField वस्तुओं यह Django के व्यवस्थापक के साथ काम करने के लिए संभालती है परिभाषित करने के लिए की जरूरत है। Here एक लिंक है जहां आप महान नमूना कोड पा सकते हैं।

अपने models.py फाइल में इस वर्ग के जोड़े और Cart मॉडल में EmbedOverrideField बजाय EmbeddedModelField का उपयोग करें:: forms.py में

class EmbedOverrideField(EmbeddedModelField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, ObjectListField, **kwargs) 

एक वर्ग को लागू करें दो तरीकों है कि:

class ObjectListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well 
नीचे प्रदर्शन के लिए सिर्फ कोड खंड हैं

Use ListFields in Django's admin

आपको एक वर्ग को परिभाषित करने की भी आवश्यकता है जो सूची फ़ील्ड ऑब्जेक्ट्स को Django के व्यवस्थापक के साथ काम करने के लिए संभालती है। Here एक लिंक है जहां आप महान नमूना कोड पा सकते हैं।

अपने models.py फाइल में इस वर्ग के जोड़े और ItemsField बजाय ListField मॉडल की में Cart:

class ItemsField(ListField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, StringListField, **kwargs) 

forms.py में एक वर्ग को लागू करें दो तरीकों है कि:

class StringListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well 
नीचे प्रदर्शन के लिए सिर्फ कोड खंड हैं