2011-12-18 14 views
7

मैं मॉडल इस तरह की स्थापना की है:Django व्यवस्थापक परिवर्तन सूची छानने/लिंक अन्य मॉडलों के लिए

class ParentModel(models.Model): 
    some_col = models.IntegerField() 
    some_other = models.CharField() 

class ChildModel(models.Model) 
    parent = models.ForeignKey(ParentModel, related_name='children') 

class ToyModel(models.Model) 
    child_owner = models.ForeignKey(ChildModel, related_name='toys') 

अब मेरी व्यवस्थापक पैनल जब मैं ParentModel के लिए परिवर्तन सूची को खोलने में मैं एक नया क्षेत्र/स्तंभ list_display में चाहते हैं ChildModel के परिवर्तक को खोलने के लिए एक लिंक के साथ, लेकिन एक चयनित फ़िल्टर के साथ केवल चयनित माता-पिता के बच्चों को दिखाने के लिए। अभी के लिए मैं इसे इस विधि के साथ महसूस किया है, लेकिन मुझे लगता है कि यह करने के लिए एक क्लीनर तरीका है, मैं बस पता नहीं कैसे:

class ParentAdmin(admin.ModelAdmin) 
    list_display = ('id', 'some_col', 'some_other', 'list_children') 
    def list_children(self, obj): 
     url = urlresolvers.reverse('admin:appname_childmodel_changelist') 
     return '<a href="{0}?parent__id__exact={1}">List children</a>'.format(url, obj.id) 
    list_children.allow_tags = True 
    list_children.short_description = 'Children'   

admin.site.register(Parent, ParentAdmin) 

तो मेरे सवाल है, यह इस के बिना एक ही हासिल करना संभव है "लिंक हैकिंग"? क्या ParentModel परिवर्तनीय में एक अलग कॉलम में इंगित करना संभव है, अगर उसके किसी भी बच्चे के खिलौने हैं?

उत्तर

2

मुझे लगता है कि list_children कॉलम प्रदर्शित करने के लिए आपका दृष्टिकोण सही है। 'लिंक हैकिंग' के बारे में चिंता न करें, यह ठीक है।

यह इंगित करने के लिए एक कॉलम प्रदर्शित करने के लिए कि किसी ऑब्जेक्ट के बच्चों के खिलौने हैं या नहीं, बस ParentAdmin कक्षा पर एक और विधि परिभाषित करें, और इसे पहले list_display पर जोड़ें।

class ParentAdmin(admin.ModelAdmin): 
    list_display = ('id', 'some_col', 'some_other', 'list_children', 'children_has_toys') 
    ... 
    def children_has_toys(self, obj): 
     """ 
     Returns 'yes' if any of the object's children has toys, otherwise 'no' 
     """ 
     return ToyModel.objects.filter(child_owner__parent=obj).exists() 
    children_has_toys.boolean = True 

स्थापना boolean=True मतलब है Django के रूप में यह बूलियन क्षेत्रों के लिए करता है 'ऑन' या 'ऑफ' प्रतीक प्रस्तुत करना होगा। ध्यान दें कि इस दृष्टिकोण के लिए प्रति प्रश्न एक प्रश्न की आवश्यकता है (यानी ओ (एन))। आपको यह देखने के लिए परीक्षण करना होगा कि क्या आपको उत्पादन में स्वीकार्य प्रदर्शन मिलता है या नहीं।

+0

आपके उत्तर के लिए धन्यवाद, यह वास्तव में मुझे बहुत मदद करता है। मुझे हैरान है कि चेंजलिस्ट लिंक फीचर के लिए डीजेंगो के पास एक और शानदार तरीका नहीं है। वैसे भी धन्यवाद, आपकी मदद अब मेरी सभी समस्याओं का हल हो गया। –

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