2014-09-04 14 views
9

Tôi đã đọc Danh sách xem official documentation on dynamically filtering nhưng vẫn còn nhầm lẫn về cách thực sự sử dụng nó.Tự động lọc ListView CBV trong Django 1.7

Tôi hiện có một mô hình đơn giản, chúng ta hãy gọi nó 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') 

Tôi có một trang mà tôi đang thể hiện tất cả các học bổng, sử dụng 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'), 
) 

Tôi đang cố tạo liên kết trên trang chủ của trang web sẽ trả về phiên bản đã lọc của ListView này. Ví dụ: nếu ai đó nhấp vào liên kết "hiển thị học bổng cho sinh viên sau đại học", chỉ có học bổng với experience_level='G' mới được hiển thị.

Tôi không có vấn đề trở queryset này qua vỏ ->Scholarship.objects.filter(experience_level__exact='G')

Tôi chỉ không chắc chắn về cách để tự động lọc các ListView qua một thả xuống hoặc URL. Không tìm cách sử dụng plugin, mà là hiểu cách truy vấn/lọc động hoạt động trong Django.

Trả lời

11

Trước hết, bạn cần phải thay đổi urls.py của mình để nó chuyển trải nghiệm dưới dạng tham số. Một cái gì đó như thế này:

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

(ở trên sẽ trả lại 404 nếu/A hoặc/S hoặc/G không được thông qua)

Bây giờ, trong kwargs thuộc tính của CBV chúng tôi sẽ có một kwarg tên exp mà có thể được sử dụng theo phương pháp get_queryset để lọc theo cấp độ kinh nghiệm.

 
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

Bạn cũng có thể truy cập kwarg trong 'get_queryset' bằng' self.kwargs'. – SunnySydeUp

+0

Rất tiếc, bạn đã đúng, tôi đã quên mất self.kwargs !! Tôi đã thay đổi câu trả lời của mình để phản ánh điều đó (và nhiều hơn nữa là DRY). cảm ơn ! – Serafeim

+0

@Serafeim bất kỳ ý tưởng làm thế nào để mặc định để queryset nếu kwarg không có trong url? Tôi muốn sử dụng cùng một url conf cho lọc và chưa lọc – villancikos

Các vấn đề liên quan