2014-09-04 8 views
9

मैंने official documentation on dynamically filtering ListView पढ़ा है, लेकिन अभी भी इसका उपयोग करने के तरीके के बारे में अभी भी उलझन में हूं।गतिशील रूप से Django में ListView CBV फ़िल्टर करें 1.7

मैं वर्तमान में एक साधारण मॉडल है, की यह Scholarship कॉल:

class Scholarship(models.Model): 
    title = models.CharField(max_length=255) 
    submitted_date = models.DateField(auto_now=True, verbose_name='Date Submitted') 
    EXPERIENCE_LEVEL_CHOICES = (
     ('A', 'Any'), 
     ('S', 'Student'), 
     ('G', 'Graduate') 
    ) 
    experience_level = models.CharField(max_length=1, choices=EXPERIENCE_LEVEL_CHOICES, default='A') 

मैं का उपयोग कर, एक पृष्ठ मैं इन छात्रवृत्तियों के सभी जहां दिखा रहा हूँ है ListView:

views.py

from django.views.generic import ListView 
from .models import Scholarship 


class ScholarshipDirectoryView(ListView): 
    model = Scholarship 
    template_name = 'scholarship-directory.html' 

urls.py

from django.conf.urls import patterns, url 

from .views import ScholarshipDirectoryView 

urlpatterns = patterns('', 
    url(r'^$', ScholarshipDirectoryView.as_view(), name='scholarship_directory'), 
) 

मैं इस साइट के होम पेज पर लिंक जेनरेट करने की कोशिश कर रहा हूं जो इस सूची दृश्य के फ़िल्टर किए गए संस्करणों को वापस कर देगा। उदाहरण के लिए, यदि कोई "स्नातक छात्रों के लिए छात्रवृत्ति दिखाएं" लिंक पर क्लिक करता है, तो experience_level='G' के साथ केवल छात्रवृत्तियां दिखाई देंगी। >Scholarship.objects.filter(experience_level__exact='G')

मैं सिर्फ कैसे गतिशील रूप से एक लटकती या यूआरएल द्वारा ListView फिल्टर करने के लिए के बारे में अनिश्चित हूँ -

मुझे कोई खोल के माध्यम से इस क्वेरीसमूह लौटने समस्या है। प्लगइन का उपयोग नहीं करना चाहते हैं, बल्कि यह समझें कि Django में गतिशील रूप से पूछताछ/फ़िल्टरिंग कैसे काम करती है।

उत्तर

11

सबसे पहले आपको अपना urls.py बदलने की जरूरत है ताकि यह अनुभव को पैरामीटर के रूप में पास कर सके। कुछ इस तरह:

 
urlpatterns = patterns('', 
    url(r'^(?P<exp>[ASG])$', ScholarshipDirectoryView.as_view(), name='scholarship_directory'), 
) 

(ऊपर 404 वापस आ जाएगी अगर/ए या/एस या/जी पारित नहीं किया जाता है)

अब, CBV की kwargs विशेषता में हम एक kwarg exp नाम दिया जाएगा जो अनुभव स्तर द्वारा फ़िल्टर करने के लिए get_queryset विधि द्वारा उपयोग किया जा सकता है।

 
class ScholarshipDirectoryView(ListView): 
    model = Scholarship 
    template_name = 'scholarship-directory.html' 

    def get_queryset(self): 
     qs = super(ScholarshipDirectoryView, self).get_queryset() 
     return qs.filter(experience_level__exact=self.kwargs['exp']) 
+0

आप 'self.kwargs' के साथ' get_queryset' में kwargs तक पहुंच सकते हैं। – SunnySydeUp

+0

ओह हाँ हाँ आप सही हैं, मैं स्वयं के बारे में भूल जाऊंगा !! मैंने अपना जवाब बदलकर प्रतिबिंबित किया (और अधिक DRY हो)। धन्यवाद ! – Serafeim

+0

@ सेराफिम किसी भी विचार को क्वेरीफॉल्ट पर डिफ़ॉल्ट कैसे करें अगर यूआरएल में kwarg नहीं है? मैं फ़िल्टर किए गए और unfiltered – villancikos

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