поля с одинаковыми именами в GET
запросе - это бред ...
я использую django-filter, вместе со стандартной пагинацией. В шаблоне для сохранения фильтров от страницы к странице добавляете что то вроде :
<div class="paginator">
<span class="step-links">
{% if queryset.has_previous %}
<a href="?page={{ queryset.previous_page_number }}{% for key,value in request.GET.items %}{% ifnotequal key 'page' %}&{{ key }}={{ value|encode }}{% endifnotequal %}{% endfor %}">
{% trans 'previous' %}</a>
{% endif %}
<span class="current">
{% trans 'Page' %} {{ queryset.number }} {% trans 'of' %} {{ queryset.paginator.num_pages }}.
</span>
{% if queryset.has_next %}
<a href="?page={{ queryset.next_page_number }}{% for key,value in request.GET.items %}{% ifnotequal key 'page' %}&{{ key }}={{ value|encode }}{% endifnotequal %}{% endfor %}">
{% trans 'next' %}</a>
{% endif %}
</span>
</div>
и шаблонный фильтр encode
если в фильтре есть кирилица :
@register.filter(name='encode')
def encode(value):
s=unicode(value)
return urlquote(s)
а фильтр по всем полям django-filter не поддерживает, но можно попробовать написать свой , что то вроде такого :
class MultiFieldSearchFilter(Filter):
field_class = forms.CharField
def filter(self, qs, value):
lookup = self.lookup_type or 'exact'
if value in ([], (), {}, None, ''):
return qs
if isinstance(self.name, (list, tuple)):
q = Q()
for n in self.name:
q |= Q(**{u'{}__{}'.format(n, lookup): value})
qs = qs.filter(q)
else:
qs = qs.filter(**{u'{}__{}'.format(self.name, lookup): value})
if self.distinct:
qs = qs.distinct()
return qs
class MyModelFilter(django_filters.FilterSet):
search = MultiFieldSearchFilter(
name=['model_name', 'model_fields'],
lookup_type='icontains', label=u'Поиск по нескольким полям')
...
Updated 28 March 2016, 8:45 by Origin.