django-tables2'u kullanmaya başladım (ki ilk izlenimden son derece tavsiye ederim) ve kendime kolon filtrelemeyi nasıl yapacağımı soruyorum. Bunun için uygun belgeleri bulamıyorum, ama eminim ki oralarda bir yerlerde var.Django Tabloları - Sütun Filtreleme
cevap
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
bulunabilir :
class MyTableView(FilterTableView):
model = MyModel
table_class = MyTable
filterset_class = MyFilter
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.