2009-04-28 9 views
10

मैं निम्नलिखित मॉडल:, जब एक नया डेमो बनानेDjango व्यवस्थापक में एक और विकल्प क्षेत्र के आधार पर चुनाव क्षेत्र के लिए विकल्पों को सीमित करने के लिए कैसे

class Category(models.Model): 
    name = models.CharField(max_length=40) 

class Item(models.Model): 
    name = models.CharField(max_length=40) 
    category = models.ForeignKey(Category) 

class Demo(models.Model): 
    name = models.CharField(max_length=40) 
    category = models.ForeignKey(Category) 
    item = models.ForeignKey(Item) 

व्यवस्थापक इंटरफ़ेस में उपयोगकर्ता ड्रॉप-डाउन से श्रेणी उठाता है के बाद, मैं करूंगा "आइटम" ड्रॉप-डाउन में विकल्पों की संख्या सीमित करना चाहते हैं। यदि उपयोगकर्ता किसी अन्य श्रेणी का चयन करता है तो आइटम विकल्पों को तदनुसार अपडेट करना चाहिए। सर्वर पर फॉर्म सत्यापन को हिट करने से पहले, मैं क्लाइंट पर आइटम विकल्पों को सीमित करना चाहता हूं। यह प्रयोज्यता के लिए है, क्योंकि वस्तुओं की सूची 1000+ हो सकती है, इसे श्रेणी से कम करने में सक्षम होने से यह अधिक प्रबंधनीय बनने में मदद मिलेगी।

क्या ऐसा करने का कोई "django-way" है या कस्टम जावास्क्रिप्ट यहां एकमात्र विकल्प है?

+1

क्या यह वास्तव में Django मॉडल में सेट करने का कोई तरीका नहीं है? –

+0

हाँ वहाँ है। एक थर्ड पार्टी ऐप के साथ। मेरा जवाब देखें –

उत्तर

10

यहाँ कुछ जावास्क्रिप्ट (JQuery आधारित) जब श्रेणी परिवर्तन आइटम विकल्प मान बदलने के लिए है आइटम नहीं है।

आप इसे model admin media definitions का उपयोग करके अपने व्यवस्थापक में लगा सकते हैं।

+0

+1 -> मैं कुछ बहुत ही समान पोस्ट करने वाला था। ओपी को डीबी में जानकारी का उपयोग करके सूचियों को पॉप्युलेट करने की आवश्यकता है और फिर आपके द्वारा प्रदान किए गए जेएस का उपयोग करके विकल्पों को स्विच करें :-) –

+0

... या यदि आप इसे एक साथ लोड नहीं करना चाहते हैं, तो आप कुछ AJAX का उपयोग कर सकते हैं जब भी उपयोगकर्ता विकल्प बदलता है तो सर्वर से श्रेणी का अनुरोध करने के लिए। निर्भर करता है कि क्या आप हिट अप लेना चाहते हैं या जब वे चयन कर रहे हैं तो उन्हें देरी करना चाहते हैं ... –

+0

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

0

मुझे लगता है कि जावास्क्रिप्ट/AJAX इस समस्या के लिए सबसे अच्छा तरीका होगा।

<script charset="utf-8" type="text/javascript"> 
    $(function(){ 
    $("select#id_category").change(function(){ 
     $.getJSON("/items/",{id: $(this).val(), view: 'json'}, function(j) { 
     var options = '<option value="">--------&nbsp;</option>'; 
     for (var i = 0; i < j.length; i++) { 
      options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>'; 
     } 
     $("#id_item").html(options); 
     $("#id_item option:first").attr('selected', 'selected'); 
     }) 
     $("#id_category").attr('selected', 'selected'); 
    }) 
    }) 
</script> 

आप एक ऐसा दृश्य/मदों पर कहा जा/URL मान्य की एक JSON सूची की आपूर्ति की जरूरत है:

+3

उपरोक्त उत्तर पर अपने उत्तर के उत्तर पर एक टिप्पणी की तरह लगता है। – boatcoder

0

आपको वस्तुओं को फ़िल्टर करने के किसी प्रकार का गैर-सर्वर आधारित तंत्र होना आवश्यक होगा। या तो, या जब चयन किया जाता है तो आप पेज को फिर से लोड कर सकते हैं (जो जावास्क्रिप्ट में वैसे भी किया जा सकता है)।

अन्यथा, सर्वर से सर्वर से डेटा का सबसेट प्राप्त करने का कोई तरीका नहीं है।

4

वहाँ django-smart-selects है:

आप निम्नलिखित मॉडल है:

class Location(models.Model) 
    continent = models.ForeignKey(Continent) 
    country = models.ForeignKey(Country) 
    area = models.ForeignKey(Area) 
    city = models.CharField(max_length=50) 
    street = models.CharField(max_length=100) 

और आप चाहते हैं कि यदि आप एक महाद्वीप का चयन केवल उन देशों में उपलब्ध हैं कि इस महाद्वीप पर स्थित हैं और के लिए एक ही क्षेत्र आप निम्नलिखित कर सकते हैं:

from smart_selects.db_fields import ChainedForeignKey 

class Location(models.Model) 
    continent = models.ForeignKey(Continent) 
    country = ChainedForeignKey(
     Country, 
     chained_field="continent", 
     chained_model_field="continent", 
     show_all=False, 
     auto_choose=True 
    ) 
    area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country") 
    city = models.CharField(max_length=50) 
    street = models.CharField(max_length=100) 
संबंधित मुद्दे

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