2011-01-24 15 views
19

में चेकबॉक्स के रूप में कईToManyField दिखाएं क्या Django Admin में चेकबॉक्स के रूप में ManyToManyField दिखाने का कोई आसान तरीका है ?? कोई सुझाव?Django Admin

+0

मैं स्वीकार किए जाते हैं जवाब बदल रहा है, ताकि आगंतुकों को भ्रमित नहीं करने के लिए सुझाव है। – surfer190

उत्तर

47

this answer से ऐसा लगता है जैसे कि यह CheckBoxSelectMultiple उपयोग करने के लिए उपयोग करने के लिए ModelAdmin.formfield_overrides ManyToManyField ओवरराइड करने के लिए संभव है:

from django.db import models 
from django.contrib import admin 
from django.forms import CheckboxSelectMultiple 

class MyModelAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
     models.ManyToManyField: {'widget': CheckboxSelectMultiple}, 
    } 

मैं इसे करने की कोशिश नहीं की है और केवल स्रोत से उद्धृत कर रहा हूँ, लेकिन यह प्रशंसनीय लगता है। सौभाग्य।

चेतावनी: के रूप में @errx ठीक ही, documentation पर प्रकाश डाला निम्नलिखित चेतावनी ने कहा:

आप एक रिश्ता क्षेत्र के साथ एक कस्टम विजेट उपयोग करना चाहते हैं (यानी ForeignKey या ManyToManyField), सुनिश्चित करें कि आप में उस क्षेत्र का नाम raw_id_fields या radio_fields में शामिल नहीं किया है।

formfield_overrides नहीं दूँगी तुम संबंध क्षेत्रों है raw_id_fields या radio_fields सेट पर विजेट बदल । ऐसा इसलिए है क्योंकि raw_id_fields और radio_fields अपने स्वयं के कस्टम विजेट्स को इंगित करता है।

+0

django दस्तावेज़ों से एक चेतावनी है। यदि आप एक रिलेशनशिप फ़ील्ड (यानी विदेशीकी या कई टोमनीफिल्ड) के साथ कस्टम विजेट का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आपने उस फ़ील्ड का नाम raw_id_fields या radio_fields में शामिल नहीं किया है। formfield_overrides आपको raw_id_fields या radio_fields सेट वाले संबंध फ़ील्ड पर विजेट बदलने नहीं देंगे। ऐसा इसलिए है क्योंकि raw_id_fields और radio_fields स्वयं के कस्टम विजेट का संकेत देते हैं। – errx

+0

सिर के लिए धन्यवाद। उत्तर में चेतावनी रखेगा। –

0

मुझे लगता है कि ऐसा करने का कोई आसान तरीका नहीं है। आप ModelAdmin कक्षा को ओवरराइड करने का प्रयास कर सकते हैं लेकिन यह एक "सरल" तरीका नहीं है।

लेकिन आप लगभग इसी तरह की सुविधा

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_horizontal

4

यह सबसे निश्चित रूप से संभव है जोड़ने के लिए filter_horizontal या filter_vertical उपयोग कर सकते हैं।

def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
    if db_field.name == 'your field name': 
     kwargs['widget'] = form_widgets.CheckboxSelectMultiple() 
     kwargs['help_text'] = '' 

    return db_field.formfield(**kwargs) 

यह व्यवस्थापक कोड में देख से निकाला गया था: यहाँ कोड है जो आप ModelAdmin उपवर्ग में जगह कर सकते हैं।

4

एकल फ़ील्ड में निम्नलिखित के लिए ओवरराइड करने के लिए उपयोगी है:

def get_form(self, request, obj=None, **kwargs): 
    form = super(VNodeAdmin, self).get_form(request, obj, **kwargs) 
    form.base_fields['node_type'].widget = forms.CheckboxSelectMultiple() 
    return form