2014-09-04 77 views
9

我讀過official documentation on dynamically filtering ListView,但我仍然對如何實際使用它感到困惑。在Django 1.7中動態過濾ListView CBV

我現在有一個簡單的模型,我們稱之爲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'), 
) 

我試圖在網站的主頁上生成鏈接,該鏈接將返回此ListView的過濾版本。例如,如果有人點擊「顯示研究生獎學金」鏈接,則只會顯示experience_level='G'的獎學金。

我沒有問題,通過外殼返回該查詢集 - >Scholarship.objects.filter(experience_level__exact='G')

我只是不知道如何通過一個下拉列表或URL動態篩選ListView控件。不想使用插件,而是瞭解動態查詢/過濾在Django中的工作方式。

回答

11

首先,您需要更改您的urls.py,以便它將經驗作爲參數傳遞。事情是這樣的:

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

(上面會返回404,如果/ A或/ S或/ G不通過)現在

,在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 2014-09-06 03:57:12

+0

Ooops是的,你是對的,我忘了self.kwargs!我改變了我的答案,以反映(並更幹)。謝謝 ! – Serafeim 2014-09-06 07:59:24

+0

@Serafeim任何想法如果默認爲查詢集如果kwarg不在url中?我想使用相同的URL conf過濾和未過濾 – villancikos 2016-08-12 01:24:06