2012-03-13 13 views
10

के आधार पर क्वेरीसमूह मैं एक मॉडल है कि इस तरह दिखता है। आमंत्रण मॉडल में, मैं केवल रोल मॉडल में सभी प्रविष्टियों को दिखाने के बजाय Django Admin के भीतर परिवर्तन फ़ॉर्म में चुने गए ईवेंट से जुड़ी भूमिकाओं को कैसे दिखा सकता हूं?Django सीमा ManytoMany चयनित FK

उत्तर

6

आप गतिशील roleschoices के विकल्पों फ़िल्टर करना चाहते हैं, तो आप ajax जरूरत है इस कार्य को करने होंगे।

यहाँ कैसे आप इस कार्य करवा सकते है ..

1:event की OnChangeajax के माध्यम से कस्टम view करने के लिए event_id भेजें।

2:Roles मॉडल filterevent_id के आधार पर आप ajax अनुरोध से मिला है और फ़िल्टर्ड roles लौट JSON में serializing द्वारा से।

3: मौजूदा roles साफ़ करें और JSON प्रतिक्रिया के माध्यम से पार्सिंग द्वारा दोबारा तैयार करें।

उदाहरण के लिए: यह एक jquerygetJSON उदाहरण

जावास्क्रिप्ट:

$("#event").change(function(){   
var event_id = $(this).val();    
    $.getJSON("/my-app/my-roles-filter-view/"+ event_id +"/",function(data){ 
     var roles_dd = $("#roles"); 
     $('#event >option').remove(); 
     $.each(data, function(index,value) { 
     roles_dd.append($("<option />").val(value).text(value)); 
    });     
})(django.jquery); 

यूआरएल की:

('^/my-app/my-roles-filter-view/(?P<event_id>\d+)/$','my_view'), 

विचार:

def my_view(request,event_id): 
    qs = Role.objects.filter(event=event_id).values_list('id') 
    return HttpResponse(simplejson.dumps(qs),mimetype='application/javascript') 

यह एक उदाहरण मात्र jquery का उपयोग कर आप ajax किसी भी प्रकार का उपयोग करें और इस लक्ष्य को हासिल कर सकते हैं।

+4

नहीं, यह पायथन कोड में (और चाहिए) हासिल किया जा सकता है। – DrMeers

+0

समाधान को जावा स्क्रिप्ट की आवश्यकता होती है क्योंकि जब वह फॉर्म में 'ईवेंट' चुनता है तो भूमिकाओं को गतिशील रूप से फ़िल्टर किया जाना चाहिए (बिना बटन दबाए, पूरे फॉर्म को सबमिट करना और फिर फ़िल्टर किए गए विकल्पों के साथ वापस आना) इसलिए 'अजैक्स' तरीका है चले जाओ। – Pannu

+0

हां, यदि आप विजेट में चयनित ईवेंट को बदलते समय ब्राउज़र में बदलना चाहते हैं, तो निश्चित रूप से आपको जावास्क्रिप्ट का उपयोग करने की आवश्यकता है। क्षमा करें, मैं गलत पढ़ता हूं। – DrMeers

2

आपको मॉडल के लिए अपने व्यवस्थापक वर्ग में एक कस्टम formfield_for_foreignkey विधि प्रदान करने की आवश्यकता है।

(प्रलेखन कि मैं जुड़ा हुआ से) यह उदाहरण, मिलना चाहिए आप आरंभ:

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "car": 
      kwargs["queryset"] = Car.objects.filter(owner=request.user) 
     return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
+1

यह लोड समय और इसके गतिशील नहीं पर किया जाएगा: यहाँ एक विवरण और कोड यदि आप रुचि रखते हैं है। मेरा मानना ​​है कि 'विकल्प' को गतिशील रूप से 'फ़िल्टर किया जाना चाहिए'। यही सवाल है कि सवाल क्या है। – Pannu

+0

@ पन्नू: नहीं, यह वास्तव में सही समाधान के करीब है, लेकिन इस विशेष समस्या को हल करने के लिए आपको प्रश्न में आमंत्रण के उदाहरण की आवश्यकता है। – DrMeers

9

आप शायद की तर्ज पर कुछ चाहते हैं:

class InviteAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     self.instance = obj # Capture instance before the form gets generated 
     return super(InviteAdmin, self).get_form(request, obj=obj, **kwargs) 

    def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
     if db_field.name == 'role' and self.instance: 
      # restrict role queryset to those related to this instance:   
      kwargs['queryset'] = self.instance.event.roles.all() 
     return super(InviteAdmin, self).formfield_for_manytomany(
      db_field, request=request, **kwargs) 

Django documentation for formfield_for_manytomany

+2

सवाल स्पष्ट रूप से कहते हैं कि निश्चित रूप से गतिशील किया जा रहा है (AJAX) "कैसे मैं केवल घटना मैं गया है ** चयनित ** ** परिवर्तन प्रपत्र ** में साथ जुड़े भूमिकाओं दिखा सकते हैं"। आपका समाधान स्थिर है। – Pannu

+0

आह, मैंने उस विवरण को याद किया, धन्यवाद। मैं जरूरी यह एक * स्थिर * समाधान के रूप में यह वस्तु भरी हुई और घटना डेटाबेस में चयनित के आधार पर भिन्न फोन नहीं होगा, लेकिन मुझे लगता है कि आप सही इस समस्या का समाधान नहीं करता है * वास्तव * प्रस्तुत किया जा रहा हो :) – DrMeers

1

मेरा मानना ​​है कि वहाँ इस के हल के लिए दो तरीके हैं:

  1. ajax विधि के रूप में @Pannu

    द्वारा वर्णित
  2. गैर-AJAX विधि जो प्राप्त की जा सकती है डी event फ़ील्ड को बदलने के फॉर्म के बाहर ले जाकर (जिसका अर्थ है कि event बदलने के लिए एक और रूप होगा) और वर्तमान event पर आधारित roles फ़िल्टर करना। मुझे विशिष्ट साइट पर ऑब्जेक्ट से संबंधित उपलब्ध विकल्पों को सीमित करने के साथ हाल ही में इसी तरह की समस्या को हल करना पड़ा। http://source.mihelac.org/2011/09/8/django-sites-ext/

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