Django Filter - Разбить результаты на страницы

Я использую django-filter для вывода отфильтрованных результатов моей модели. Никаких проблем. Следующим шагом является добавление пагинатора ... хотя уже несколько дней борюсь.

просмотров.py:

def funds_overview(request):
 f = FundFilter(request.GET, queryset=Fund.objects.all()).qs
 paginator = Paginator(f, 5)
 page = request.GET.get('page')
 funds = paginator.get_page(page)
 return render(request, 'funds/funds.html', {'filter': funds})

фонды.html:

<form method="get">
<div class="well">
 <h4 style="margin-top: 0">Search Criteria</h4>

  <div class="row">
   <div class="form-group col-sm-4 col-md-3">
    {{ filter.form.fund_name.label_tag }}
    {% render_field filter.form.fund_name class="form-control" %}
   </div>
  </div>

<button type="submit" class="btn btn-primary">
  <span class="glyphicon glyphicon-search"></span> Search
</button>

{% for fund in filter.qs %}
<p>{{fund.name}} </p>

{% empty %}

No funds match your search criteria

{% endfor %}

Результат в браузере Строка "нет средств, соответствующих вашим критериям поиска"..

кто-нибудь может помочь? Я предполагаю, что что-то не так с вызовом запроса GET дважды?

Спасибо !


person TMD    schedule 17.02.2019    source источник
comment
Я разместил ответ, показывающий проблему с использованием страницы в вашем шаблоне, помогло ли это?   -  person Bernardo Duarte    schedule 17.02.2019


Ответы (1)


Вы передаете новый контекст, где filter теперь является страницей, поэтому при использовании {% for fund in filter.qs %} вы получаете доступ к полю, которого нет в объекте страницы, поэтому будет пустой цикл.

Попробуйте изменить filter.qs только на фильтр.

Это решит проблему разбивки на страницы, но возникает еще одна проблема, связанная с передачей контекста функции рендеринга. Как показано ниже, вы должны добавить еще одну переменную контекста, чтобы ваша страница отображала отфильтрованную форму.

views.py:

def funds_overview(request):
 funds = FundFilter(request.GET, queryset=Fund.objects.all()).qs
 paginator = Paginator(f, 5)
 page = request.GET.get('page')
 fund_page = paginator.get_page(page)
 return render(request, 'funds/funds.html', {'filter': funds, 'page': fund_page})

funds.html:

<form method="get">
<div class="well">
 <h4 style="margin-top: 0">Search Criteria</h4>

  <div class="row">
   <div class="form-group col-sm-4 col-md-3">
    {{ filter.form.fund_name.label_tag }}
    {% render_field filter.form.fund_name class="form-control" %}
   </div>
  </div>

<button type="submit" class="btn btn-primary">
  <span class="glyphicon glyphicon-search"></span> Search
</button>

{% for fund in page %}
<p>{{fund.name}} </p>

{% empty %}

No funds match your search criteria

{% endfor %}
Page {{ page.number }} of {{ page.paginator.num_pages }}
person Bernardo Duarte    schedule 17.02.2019
comment
Привет Бернардо. это отчасти помогает: теперь я вижу первые 5 строк базы данных. Хотя нет страницы 1 из 2 или похожей, и (как было раньше) поле/формы поиска не появляются - person TMD; 17.02.2019
comment
@TMD Я обновил ответ, чтобы показать возможное решение для вашего случая. - person Bernardo Duarte; 17.02.2019
comment
Спасибо Бернардо. Теперь он действительно показывает «страницу x из y», хотя я не могу ее пролистать..? - person TMD; 17.02.2019
comment
@TMD Я считаю, что это был бы совсем другой вопрос, и я думаю, что вам лучше сначала попробовать это самому; D В любом случае, я думаю эта ссылка должна помочь. Если мой ответ помог вам достичь цели вашего вопроса, пожалуйста, не забудьте проголосовать и отметить как решенный. - person Bernardo Duarte; 18.02.2019
comment
@BernardoDuarte спасибо, это помогло! Моя проблема в том, что я использовал цикл for с полезной нагрузкой фильтра вместо полезной нагрузки разбиения на страницы. - person kingmilo; 30.06.2021