2012-07-11 11 views
6

में __unicode__ के अलावा अन्य विधि का उपयोग करें मैं Django में कुछ रूपों पर काम कर रहा हूं। मॉडल में एक क्षेत्र ForeignKey है, इसलिए फ़ॉर्म में ModelChoiceField के रूप में प्रतिनिधित्व किया गया है। ModelChoiceField वर्तमान में सूची को पॉप्युलेट करने के लिए मॉडल की __unicode__ विधि का उपयोग करता है, जो मेरा वांछित व्यवहार नहीं है। मैं मॉडल की एक और विधि का उपयोग करने में सक्षम होना चाहता हूँ। दस्तावेज़ों से, ऐसा लगता है कि मैं अपने QuerySet को मजबूर कर सकता हूं, लेकिन मैं नहीं देख सकता कि यह __unicode__ के अलावा किसी विधि का उपयोग करने में मेरी सहायता कैसे करेगा।ModelChoiceField Django

मैं वास्तव में यदि संभव हो तो डिफ़ॉल्ट रूप से इसे डिफ़ॉल्ट रूप से विभाजित करने से बचाना चाहता हूं।

कोई सुझाव?

उत्तर

1

इतना कस्टम क्वेरीसेट नहीं है, लेकिन आपकी क्वेरीसेट को एक सूची में परिवर्तित कर रहा है। तो बस यह अपने आप को एक सूची समझ के साथ क्या

(item.pk, item.__unicode__()) 

: तुम सिर्फ choices=some_queryset करते हैं Django के रूप में विकल्प बनाता है

choices=[(item.pk, item.some_other_method()) for item in some_queryset] 
+0

धन्यवाद। वास्तव में आसान – TimD

10

आप एक अलग विधि निर्दिष्ट करने के लिए label_from_instance ओवरराइड कर सकते हैं:

from django.forms.models import ModelChoiceField 

class MyModelChoiceField(ModelChoiceField): 

    def label_from_instance(self, obj): 
     return obj.my_custom_method() 

फिर आप इस क्षेत्र का उपयोग अपने फॉर्म में कर सकते हैं। इस विधि का उद्देश्य subclasses में ओवरराइड किया जाना है। django.forms.models में मूल स्रोत यहां दिया गया है:

# this method will be used to create object labels by the QuerySetIterator. 
# Override it to customize the label. 
def label_from_instance(self, obj): 
    """ 
    This method is used to convert objects into strings; it's used to 
    generate the labels for the choices presented by this object. Subclasses 
    can override this method to customize the display of the choices. 
    """ 
    return smart_unicode(obj)