2010-03-04 23 views
20

मैं एक विदेशी कुंजी की संपत्ति द्वारा एक व्यवस्थापक परिवर्तक में एक फ़िल्टर जोड़ना चाहता हूं, उदा।विदेशी कुंजी संपत्ति पर Django व्यवस्थापक फ़िल्टर

class Address(model.Models): 
    street = models.CharField(max_length=25)   
    city = models.CharField(max_length=25) 
    country = models.CharField(max_length=25)   

class Customer(models.Model): 
    name = models.CharField(max_length=25) 
    address = models.ForeignKey(Address) 

के ग्राहक व्यवस्थापक परिवर्तन सूची मैं शहर तथा देश का एक फिल्टर दिखाना चाहते हैं मान लीजिए (ताकि मुझे एक विशेष देश या शहर में सभी ग्राहकों को दिखाने)।

लेकिन मानक list_filter() कार्यक्षमता केवल मॉडल पर सीधे फ़ील्ड द्वारा फ़िल्टरिंग की अनुमति देती है, न कि इसकी किसी भी विदेशी कुंजी पर। मैं कोशिश की है:

list_filter = ("address__country",) 

या

list_filter = ("address.country",) 

लेकिन मैं हमेशा त्रुटि के एक ही प्रकार प्राप्त करें:

'address__country' is not a callable or an attribute 

कोई सुझाव स्वागत किया जाएगा। क्या एफके गुणों पर फ़िल्टरिंग की अनुमति देने के लिए कुछ विशेष नामकरण सम्मेलन/वाक्यविन्यास है?

+0

http://stackoverflow.com/questions/2065036/django-list-filter-and-foreign-key-fields –

उत्तर

1

मैंने पाया और समाधान निम्नलिखित का परीक्षण किया है:

http://www.djangosnippets.org/snippets/1911/

यह ForeignKeys के साथ काम करता है, लेकिन यह ManyToMany संबंधों के साथ काम नहीं करता।

+0

सरल http://djangosnippets.org/snippets/1558/ – maazza

0

मैं एक ही समस्या में भाग गया और वास्तव में एक समाधान की आवश्यकता थी। मेरे पास एक वर्कअराउंड है जो आपको एफके से संबंधित मॉडल प्रॉपर्टी पर फ़िल्टर बनाने देता है। आप एक से अधिक एफके रिश्तों को भी पार कर सकते हैं। यह एक नया फ़िल्टरस्पेक सबक्लास बनाता है जो डिफ़ॉल्ट संबंधित फ़िल्टर को उप-वर्गीकृत करता है जो आपको विदेशीकी फ़ील्ड पर फ़िल्टर देने के लिए उपयोग किया जाता है।

http://djangosnippets.org/snippets/2260/

18

देखें https://code.djangoproject.com/ticket/3400 देखें। यह Django में ठीक काम करता है 1.3 :)

class Room(models.Model): 
    house = models.ForeignKey(House) 

    def __unicode__(self): 
     return self.house.town.name 

class Booking(models.Model): 
    room = models.ForeignKey(Room) 

    def __unicode__(self): 
     return self.room.house.town.name 

class BookingOpts(admin.ModelAdmin): 
    list_filter = ('room__house__town',) 
    raw_id_admin = ('room',) 

admin.site.register(Town) 
admin.site.register(House) 
admin.site.register(Room) 
admin.site.register(Booking, BookingOpts) 
+0

अच्छा सुझाव, यह Django 1.3.3 पर आसानी से काम करता है, धन्यवाद। स्पष्ट नोट: पहला और दूसरा वर्ग models.py पर जाता है और अंतिम फ़ंक्शन रजिस्टर फ़ंक्शन के साथ admin.py पर जाता है। rooms__house__town का अनुवाद कमरे में है .house.town। – chirale

+1

मुझे अभी इसी समस्या के लिए यह समाधान मिला है। यदि आपको अपने फ़िल्टर में अधिक शक्ति की आवश्यकता है, तो django.contrib.admin.SimpleListFilter को विस्तारित करने और अपना स्वयं का फ़िल्टर रोल करने में देखें। मैंने अभी अपनी नई परियोजना के लिए यह किया है, और यह पहले की तुलना में बहुत आसान है। – Hovis

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