Sunday, 15 May 2011

django - Limit foreign key choices in select in an inline form in admin -


तर्क का मॉडल है:

  • एक भवन कई कमरे
  • एक कक्ष एक और कक्ष के अंदर हो सकता है (उदाहरण के लिए एक कोठरी, - ' स्वयं ')
  • एक कक्ष केवल एक ही इमारत में दूसरे कक्ष में हो सकता है (यह मुश्किल भाग है)

यहां मेरे पास कोड है:

  # spaces / models.py से django.db आयात मॉडल वर्ग बिल्डिंग (models.Model): name = models.CharField (max_length = 32) Def __unicode __ (स्वयं): रिटर्न self.name वर्ग कक्ष (models.Model): number = models.CharField (max_length = 8) बिल्डिंग = मॉडेल। फ़नरिस (बिल्डिंग) inside_room = models.ForeignKey ('self', blank = true, Null = true) def __unicode __ (स्व): वापस स्वयं। संख्या  

और:

  # spaces / admin.py से ex.spaces.models आयात करें बिल्डिंग, डीजेंगो.कॉन्त्रिब आयात व्यवस्थापक वर्ग RoomAdm से कक्ष में (admin.ModelAdmin): पास कक्षा RoomInline (admin.TabularInline): मॉडल = कक्ष अतिरिक्त = 2 वर्ग BuildingAdmin (admin.ModelAdmin): inlines = [RoomInline] admin.site.register (बिल्डिंग, बिल्डिंगएडमिन) admin.site.register (कक्ष)  

इनलाइन केवल मौजूदा भवन के कमरे दिखाएगा (जो कि मैं चाहता हूं)। हालांकि, समस्या यह है कि अंदर के कमरे ड्रॉप डाउन के लिए, यह कमरा तालिका (अन्य इमारतों में उन सहित) के सभी कमरों को प्रदर्शित करता है।

इनलाइन की < कोड> कमरे , मुझे इन-इन-रूम विकल्पों को केवल कमरे को सीमित करने की आवश्यकता है, जो मौजूदा भवन में है (वर्तमान में बिल्डिंग रिकॉर्ड मुख्य बिल्डिंगएडमिन फ़ॉर्म द्वारा बदला जा रहा है)

मैं मॉडल में एक limit_choices_to के साथ ऐसा करने का एक तरीका नहीं समझ सकता, न ही मैं यह जान सकता हूँ कि व्यवस्थापक के इनलाइन रूपों को ठीक से कैसे ओवरराइड करना है (मुझे लगता है जैसे कि मुझे किसी तरह कस्टम इनलाइन फॉर्म बनाना चाहिए, कस्टम इनलाइन के मुख्य फ़ॉर्म के भवन_आईडी को पारित करना चाहिए, फिर उसके आधार पर फ़ील्ड के विकल्पों के लिए क्वेरीसेट को सीमित करें - लेकिन मैं यह कैसे करूँ यह मेरे सिर को लपेट नहीं कर सकता )।

शायद यह व्यवस्थापक साइट के लिए बहुत जटिल है, लेकिन ऐसा कुछ ऐसा लगता है जो आम तौर पर उपयोगी होगा ...

obj के लिए अस्थायी कंटेनर के रूप में प्रयुक्त अनुरोध उदाहरण क्वेरीस को संशोधित करने के लिए इनलाइन विधि formfield_for_foreignkey ओवरराइड किया गया यह कम से कम डीजेंगो 1.2.3 पर काम करता है।

  वर्ग RoomInline (admin.TabularInline): मॉडल = कक्ष def formfield_for_foreignkey (स्वयं, db_field, अनुरोध = कोई नहीं, ** kwargs): field = super (RoomInline, स्वयं) .formfield_for_foreignkey (db_field, अनुरोध, ** kwargs) अगर db_field.name == 'inside_room': यदि request._obj_ नहीं है: field.queryset = field.queryset.filter (building__exact = request._obj_) Else: field.queryset = field.queryset.none () वापसी फ़ील्ड कक्षा BuildingAdmin (admin.ModelAdmin): inlines = (RoomInline,) def get_form (स्वयं, अनुरोध, obj = कोई नहीं, ** kwargs): # बस obj संदर्भ को बचाने इनलाइन अनुरोध में भावी प्रसंस्करण के लिए। _obj_ = obj रिटर्न सुपर (बिल्डिंगएडमिन, स्वयं) .get_form (अनुरोध, obj, ** kwargs)  

No comments:

Post a Comment