2012-11-28 28 views

cevap

23

Biraz geç cevap ama yine de ... Sütun filtreleme için uygun bir belge bulamadım. bunu yapmak için birçok yöntem vardır:

yandan By A.:

 
    data = models.MyClass.all() 
    form = forms.MyFilterForm(request.GET) 
    if request.GET.get('field1'): 
    data = data.filter(field1=request.GET.get('field1')) 
    if request.GET.get('field2'): 
    data = data.filter(field2=request.GET.get('field2')) 
    ... 
    table = tables.MyTable(data) 
: Ben hiçbir zaman bu filtreleme yapmak istediğiniz ve sonra benim görünümünde böyle bir şey yapmak alanları içeren bir form eklemek

Bu çok güzel çalışıyor ancak DRY olmadığı için görünümünde kodlanmış.

B. SingleTableView kullanılması: Bir başka yöntem olan form içeren bir SingleTableView ekleyin: Bu daha fazla kuru :) olan

 
from django_tables2 import SingleTableView 
class FilteredSingleTableView(SingleTableView): 
    def get_table_data(self): 
    data= models.MyClass.objects.all 
    if self.request.GET.get('field1'): 
     data = data.filter(field1=self.request.GET.get('field1')) 
    if self.request.GET.get('field1'): 
     data = data.filter(field1=self.request.GET.get('field1')) 
    return data 

    def get_context_data(self, **kwargs): 
     context = super(FilteredSingleTableView, self).get_context_data(**kwargs) 
     context['form'] = forms.MyFilterForm(self.request.user, self.request.GET) 
     return context 

C kullanılarak SingleTableView ve django_filters: Bu muhtemelen en çok KURUTMA şeklindedir :) İşte nasıl yapılır:

İlk önce bir filtre tanımlayın:

 
class MyFilter(django_filters.FilterSet): 
    field1 = django_filters.CharFilter() 
    field2 = django_filters.CharFilter() 
... 

(ya da benzeri bir SingleTableView oluşturmak, Şimdi Meta (model = MyModel)

bir model filtre ekleyebilirsiniz bu

 
class FilteredSingleTableView(SingleTableView): 
    def get_table_data(self): 
    f = filters.MyFilter(self.request.GET, queryset =models.MyClass.objects.all() , request=self.request) 
    return f 

    def get_context_data(self, **kwargs): 
    context = super(FilteredSingleTableView, self).get_context_data(**kwargs) 
    f = filters.MyFilter(self.request.GET, queryset =models.MyClass.objects.all() , request=self.request) 
    context['form'] = f.form 
    return context 

(muhtemelen çizgi f ile ilgili bir sorun var = ... ama aksi halde işe yaramazdım.

Son olarak, genel bir sınıfını kullanma bu

 
url(r'^$', views.FilteredSingleTableView.as_view(
    table_class = tables.MyTable, 
    model=models.MyClass, 
    template_name ='mytemplate.html', 
    table_pagination={ "per_page":50 })) , 
    name='filtered_single_table_view' 
), 

D. gibi urls.py gelen SingleTableView arayabilirsiniz: Bu yol gibi daha da KURU ve django-jenerik-sınıf görünümleri olan ! Bu aslında C sonraki adımdır: Eğer aralarında sizin urls.py bunu geçebilir böylece

 
class FilteredSingleTableView(django_tables2.SingleTableView): 
    filter_class = None 

    def get_table_data(self): 
    self.filter = self.filter_class(self.request.GET, queryset =super(FilteredSingleTableView, self).get_table_data()) 
    return self.filter.qs 

    def get_context_data(self, **kwargs): 
    context = super(FilteredSingleTableView, self).get_context_data(**kwargs) 
    context['filter'] = self.filter 
    return context 

Şimdi FilteredSingleTableView filtresinin sınıf için bir parametresi vardır: Sadece bu gibi FilteredSingleTableView beyan parametreleri:

 
    url(r'^$', ships.views.FilteredSingleTableView.as_view(
     model=models.MyModel, 
     table_class=tables.MyTable, 
     template_name='mytemplate.html' , 
     filter_class = filters.MyFilter, 
    ) , name='myview'), 

Yani modellerin herhangi filtrelemek için değişiklik yapmadan FilteredSingleTableView kullanabilirsiniz !! o zaman biz ekleyebilir her zaman böyle değildi -

Ayrıca şimdi bir örnek değişkeni olarak filtreyi kaydedip ben C (get_table_data get_context_data önce denir vardı tekrarlayan kod f=filters.MyFilter(...) kaldırdık fark Hile yapar get_filter örnek yöntemi!

Güncelleştirme 23/04/2016: Popüler taleplerden sonra, bir kitap tablosunu filtrelemek için genel FilteredSingleTableView sınıfını kullanan basit bir Django projesi oluşturdum. Sen adresinden aracı bulabilirsiniz: https://github.com/spapas/django_table_filtering

Güncelleme 2016/05/07: Eğer (Ben alread bununla cevabını güncelledik) ya da başka D yılında get_table_data dönüş için return self.filter.qs kullanması gerektiğini lütfen unutmayın

from django_filters.views import FilterView 
from django_tables2 import SingleTableView 


class FilterTableView(FilterView, SingleTableView): 
    def get_table_data(self): 
     return self.object_list 

Yani bunu yapabilirsiniz: - görünüm büyük tablolar için işlemek için çok uzun süreceğini fazla bilgi bu do genel görünüm oluşturmak için daha kolay ve kurutma yolu yoktur https://github.com/spapas/django_table_filtering/issues/1

3

bulunabilir :

class MyTableView(FilterTableView): 
    model = MyModel 
    table_class = MyTable 
    filterset_class = MyFilter 
0

Eğer Django'nın ListView veya alt sınıfı da (yerine SingleTableView) aşağıdaki işaret ile uyum içinde django_tables2.views.SingleTableMixin kullanmayı tercih:

class FilteredListViewMixin(object): 
    """ Uses django-filter to filter a ListView. """ 

    filter_class = None 

    def get_queryset(self): 
     qs = super(FilteredListViewMixin, self).get_queryset() 

     self.filter = self.filter_class(self.request.GET, 
             queryset=qs) 
     return self.filter.qs 

    def get_context_data(self, **kwargs): 
     context = super(FilteredListViewMixin, self).get_context_data(**kwargs) 
     context['filter'] = self.filter 
     return context 

Bu django-tables2 bağlanmış olmamak yararı vardır (DRY FTW), jenerik ListViews ile de kullanılabileceği anlamına gelir.