2011-08-10 25 views
12

Tôi đang sử dụng chế độ xem chung dựa trên lớp của Django 1.3 để hiển thị danh sách hình ảnh, nhưng tôi muốn thêm bộ lọc cho phép người dùng thu hẹp kết quả được hiển thị.Làm thế nào để tạo biểu mẫu bộ lọc cho danh sách đối tượng chung (lớp dựa trên) trong Django?

công trình tiếp cận hiện tại của tôi, nhưng cảm thấy khá hackish:

class ImageFilterForm(ModelForm): 
    class Meta: 
     model = Image 

class ImageListView(ListView): 
    model = Image 

    def get_queryset(self): 
     qs = Image.objects.select_related() 
     for item in self.request.GET: 
      key, value = item, self.request.GET.getlist(item) 
      # ... Filtering here ... 
     return qs 

    def get_context_data(self, **kwargs): 
     context = super(ImageListView, self).get_context_data(**kwargs) 
     context['filter_form'] = ImageFilterForm(self.request.GET) 
     return context 

Có phương tiện tốt hơn để thêm tùy chỉnh lọc để một cái nhìn chung chung?

Trả lời

20

tôi sử dụng phương pháp tương tự, nhưng chung chung, sử dụng một mixin:

class FilterMixin(object): 

    def get_queryset_filters(self): 
     filters = {} 
     for item in self.allowed_filters: 
      if item in self.request.GET: 
       filters[self.allowed_filters[item]] = self.request.GET[item] 
     return filters 

    def get_queryset(self): 
     return super(FilterMixin, self).get_queryset()\ 
       .filter(**self.get_queryset_filters()) 


class ImageListView(FilterMixin, ListView): 

    allowed_filters = { 
     'name': 'name', 
     'tag': 'tag__name', 
    } 

    # no need to override get_queryset 

này cho phép xác định một danh sách các bộ lọc chấp nhận, và họ không cần phải tương ứng với từ khóa .filter() thực tế. Sau đó bạn có thể mở rộng nó để hỗ trợ lọc phức tạp hơn (chia bởi dấu phẩy khi thực hiện một bộ lọc __in hoặc __range là một ví dụ đơn giản)

+1

Tôi chỉ tìm thấy [django-filter] (https://github.com/alex/django-filter) ứng dụng và kết hợp nó với mixin của bạn. Tôi nghĩ rằng đó là đủ sạch cho tôi ;-) Cảm ơn! – cvk

+1

Tôi cũng sử dụng bộ lọc django và kết hợp với phương thức get_queryset() ở trên và nó hoạt động độc đáo. fyi, filter.qs là thuộc tính trả về queryset đã lọc từ đối tượng filteret (một phần của ứng dụng bộ lọc django) – rsp

+0

Để sử dụng tính năng này cho forms.DateField, tôi có thể làm như thế nào? – Marcaum54

1

Hãy xem django-filter nó giải pháp dễ dàng cho dữ liệu lọc theo quan điểm

+0

có vẻ đầy hứa hẹn, tuy nhiên hãy bỏ qua AJAX! – andi

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