Я тоже искал подходящее решение. Но я не смог найти ни одного, поэтому пришлось придумать свое.
views.py
class VocationsListView(ListView):
context_object_name = "vocations"
template_name = "vocations/vocations.html"
paginate_by = 10
def get_queryset(self):
get = self.request.GET.copy()
if(len(get)):
get.pop('page')
self.baseurl = urlencode(get)
model = Vocation
self.form = SearchForm(self.request.GET)
filters = model.get_queryset(self.request.GET)
if len(filters):
model = model.objects.filter(filters)
else:
model = model.objects.all()
return model
def get_context_data(self):
context = super(VocationsListView, self).get_context_data()
context['form'] = self.form
context['baseurl']= self.baseurl
return context
models.py
class Vocation(models.Model):
title = models.CharField(max_length = 255)
intro = models.TextField()
description = models.TextField(blank = True)
date_created = models.DateTimeField(auto_now_add = True)
date_modified = models.DateTimeField(auto_now = True)
created_by = models.ForeignKey(User, related_name = "vocation_created")
modified_by = models.ForeignKey(User, related_name = "vocation_modified")
class Meta:
db_table = "vocation"
@property
def slug(self):
return defaultfilters.slugify(self.title)
def __unicode__(self):
return self.title
@staticmethod
def get_queryset(params):
date_created = params.get('date_created')
keyword = params.get('keyword')
qset = Q(pk__gt = 0)
if keyword:
qset &= Q(title__icontains = keyword)
if date_created:
qset &= Q(date_created__gte = date_created)
return qset
поэтому в основном я добавляю этот фрагмент кода в каждый класс модели, где я хочу реализовать функцию поиска. Это связано с тем, что фильтры для каждой модели должны быть подготовлены явно
@staticmethod
def get_queryset(params):
date_created = params.get('date_created')
keyword = params.get('keyword')
qset = Q(pk__gt = 0)
if keyword:
qset &= Q(title__icontains = keyword)
if date_created
qset &= Q(date_created__gte = date_created)
return qset
он подготавливает фильтр qset, который я использую для извлечения данных из модели