एक बेहतर Django व्यवस्थापक ManyToMany फील्ड विजेट


101

मुझे लगता है कि Django एडमिन का डिफ़ॉल्ट models.ManyToManyFieldविजेट उपयोग करने के लिए बोझिल है। यह HTML चुनिंदा तत्व है और यदि आपके पास "अन्य" मॉडल की बहुत सारी वस्तुएँ हैं, तो यह वास्तव में "अन्य" वस्तुओं को खोजने के लिए अव्यावहारिक है जिन्हें आप "इस" ऑब्जेक्ट के साथ जोड़ना चाहते हैं। और अगर आपके पास "अन्य" मॉडल की बहुत सी वस्तुएं हैं, तो ऐसा लगता है कि यह व्यवस्थापक पृष्ठ के प्रतिपादन को धीमा कर देता है।

मुझे पता है कि मैं अपना स्वयं का कस्टम व्यवस्थापक विजेट बना सकता हूं और इसे अपने लिए लागू कर सकता हूं ManyToManyFieldsजैसा कि मैं फिट देखता हूं, लेकिन क्या कोई पूर्व-निर्मित व्यक्ति हैं जो मैं इसके बजाय उपयोग कर सकता हूं? अपने सपनों में, मैं एक ऑटो-कम्प्लीट टेक्स्ट इनपुट HTML विजेट दिखाता हूं। क्या यह Django व्यवस्थापक ढांचे में भी व्यावहारिक / संभव है?

धन्यवाद।

जवाबों:


160

filter_horizontalउदाहरण के लिए, अपने व्यवस्थापक वर्ग की विशेषता का उपयोग करने का प्रयास करें :

class SomeModelAdmin(admin.ModelAdmin):
    filter_horizontal = ('users',)

जैसा कि दस्तावेज़ीकरण में उल्लेख किया गया है , "इस सूची में कईTTMMFField को जोड़ने के बजाय एक विनीत विनीत जावास्क्रिप्ट" फ़िल्टर "इंटरफ़ेस का उपयोग किया जाएगा जो विकल्पों के भीतर खोज करने की अनुमति देता है"। filter_verticalथोड़ा अलग लेआउट के साथ एक ही काम करता है।


महान! यह बिल्कुल वैसा ही लगता है जैसा मैं देख रहा हूं, मैं इसे आजमाऊंगा।
क्रिस डब्ल्यू।

इसकी कार्यप्रणाली लेकिन इसे केवल पढ़ने के लिए कैसे बनाया जाए। मैं केवल_फिल्ड = ('उपयोगकर्ता') पढ़ रहा हूं। लेकिन इसका दिखाया एकल लाइन में अल्पविराम द्वारा अलग किया गया है। मैं लाइन ब्रेक में दिखाना चाहता हूं ...
वर्नान के

मुझे चिंता थी कि मुझे अपना विजेट लिखना होगा, लेकिन यह एकदम सही है! उसके लिए धन्यवाद! ; पी
umat

7

आप व्यवस्थापक में एक कच्ची आईडी का उपयोग करने का प्रयास कर सकते हैं। और django डॉक्स: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.odelAdmin.raw_id_fields

यदि आप ऑटो-पूर्ण के साथ कुछ देख रहे हैं तो आप इसे एक प्रारंभिक बिंदु के रूप में देखना चाह सकते हैं। http://code.djangoproject.com/wiki/AutoCompleteSolutions

और अंत में एक बहुत ही सरल इनलाइन उदाहरण:

models.py

class SomeModel(models.Model):
    users = models.ManyToMany(User)

admin.py:

class SomeModelAdmin(admin.ModelAdmin):
    raw_id_fields = ("users",)

3

मैं वास्तव में इसके साथ नहीं खेला है, लेकिन मैंने पाया कि यह आशाजनक लाइब्रेरी कहीं और संदर्भित है।

यह वही दिखता है जो मैं चाहता था। संबंधित वस्तुओं की पूरी सूची लोड करने के बजाय (चाहे वे कितने भी हों!) और उनमें से कुछ का चयन करने के लिए आपको एक पिकर के साथ प्रस्तुत करना, जैसा कि filter_horizontalकरता है, यह एक खोज / फ़िल्टर बॉक्स प्रस्तुत करता है और परिणाम प्राप्त करने के लिए टाइप-हेड / स्वत: पूर्ण कॉल का उपयोग करता है। गतिशील। यह उस मामले के लिए बहुत अच्छा है जहां आपके पास संभवतः 5000 उपयोगकर्ता हैं और 5k <option>तत्वों को डाउनलोड करने और प्रस्तुत करने की प्रतीक्षा किए बिना उनमें से 3 या 4 को चुनना चाहते हैं ।


0

यह एक पुराना प्रश्न है, लेकिन मैं उन लोगों के लिए यहां एक उत्तर जोड़ना चाहता हूं, जो इसे वैसे ही खोजते हैं जैसे मैंने किया था: यह स्थिति बिल्कुल वैसी ही है जैसे कि Django इनलाइन के लिए है। विशेष रूप से, मैं कई-कई संबंधों के लिए कच्चे आईडी फ़ील्ड के साथ TabularInlines का उपयोग करता हूं जिनके पास बहुत अधिक विकल्प हैं।

https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.TabularInline

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.