Фильтры, не следующие по нумерации страниц в Джанго - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь настроить нумерацию страниц в своем проекте Django, но я не могу найти способ заставить фильтры (ptags в моем случае) следовать следующим страницам.

Ps;Я использую Django-haystack с огранкой для фильтрации.

У меня есть custom.py

from haystack.forms import FacetedSearchForm


class FacetedProductSearchForm(FacetedSearchForm):

    def __init__(self, *args, **kwargs):
        data = dict(kwargs.get("data", []))
        self.ptag = data.get('ptags', [])
        super(FacetedProductSearchForm, self).__init__(*args, **kwargs)

    def search(self):
        sqs = super(FacetedProductSearchForm, self).search()

        if self.ptag:
            query = None
            for ptags in self.ptag:
                if query:
                    query += u' OR '
                else:
                    query = u''
                query += u'"%s"' % sqs.query.clean(ptags)
            sqs = sqs.narrow(u'ptags_exact:%s' % query)

        return sqs

, который я передаю в своих представлениях:

class FacetedSearchView(BaseFacetedSearchView):

    form_class = FacetedProductSearchForm
    facet_fields = ['ptags']
    template_name = 'search_result.html'
    paginate_by = 3
    context_object_name = 'object_list'

Вот мойfull search_result.html:

  <div>
{% if  page_obj.object_list %}
                <ol class="row top20" id="my_list">

        {% for result in page_obj.object_list %}

<li class="list_item">
   <div class="showcase col-sm-6 col-md-4">

   <div class="matching_score"></div>

           <a href="{{ result.object.get_absolute_url }}">
              <h3>{{result.object.title}}</h3>
                      <h5>{{ result.object.destination }}</h5>
              <img src="{{ result.object.image }}" class="img-responsive">
           </a>

<div class="text-center textio">
    <ul class="tagslist">
      <li class="listi">
{% for tags in result.object.ptags.names %}

        <span class="label label-info"># {{ tags }}</span>

{% endfor %}
      </li>
    </ul>
</div>

   </div>
</li>
                  {% endfor %}
                </ol>
            </div>

Я могу передать запрос, который является пунктом назначения, на следующую страницу, добавив его в нижней части моего html:

            {% if is_paginated %}
              <ul class="pagination pull-right">
                {% if page_obj.has_previous %}
                  <li><a href="?q={{ query }}&page={{ page_obj.previous_page_number }}"><i class="fas fa-angle-left"></i>Previous page</a></li>
                {% else %}
                  <li class="disabled"><span><i class="fas fa-angle-left"></i>Previous page</span></li>
                {% endif %}
                {% if page_obj.has_next %}
                  <li><a href="?q={{ query }}&page={{ page_obj.next_page_number }}">See more results<i class="fas fa-angle-right"></i></a></li>
                {% else %}
                  <li class="disabled"><span>See more results<i class="fas fa-angle-right"></i></span></li>
                {% endif %}
              </ul>
            {% endif %}
        {% else %}
        <p> Sorry, no result found for the search term  <strong>{{query}} </strong></p>
    {% endif %}

НоЕсли я пытаюсь добавить поле ptags в коде разбивки на страницы, выполнив команду & ptags следующим образом:

{% if is_paginated %}
              <ul class="pagination pull-right">
                {% if page_obj.has_previous %}
                  <li><a href="?q={{ query }}&ptags={{page_obj.ptags.name}}&page={{ page_obj.previous_page_number }}"><i class="fas fa-angle-left"></i>Previous page</a></li>
                {% else %}
                  <li class="disabled"><span><i class="fas fa-angle-left"></i>Previous page</span></li>
                {% endif %}
                {% if page_obj.has_next %}
                  <li><a href="?q={{ query }}&ptags={{page_obj.ptags.name}}&page={{ page_obj.next_page_number }}">See more results<i class="fas fa-angle-right"></i></a></li>
                {% else %}
                  <li class="disabled"><span>See more results<i class="fas fa-angle-right"></i></span></li>
                {% endif %}
              </ul>
            {% endif %}
        {% else %}
        <p> Sorry, no result found for the search term  <strong>{{query}} </strong></p>
    {% endif %}

Я получаю эту ошибку, когда перехожу на страницу 2, а выбранные фильтры флажков (ptags) не отображаются:

Page not found (404)
Request Method: GET
Request URL:    http://localhost:8000/search/?q=las%20vegas&ptags=&page=2
Raised by:  search.views.FacetedSearchView

Как это исправить?

1 Ответ

0 голосов
/ 21 июля 2019

Ваш шаблон нумерации страниц удаляет лишние параметры фильтра, используйте это -

В вашем my_tags.py добавьте этот тег шаблона:

@register.simple_tag(name='url_replace')
def url_replace(request, field, value):
    d = request.GET.copy()
    d[field] = value
    return d.urlencode()

paginate as -

{% if is_paginated %}
      <br>
      <div class="row">
        <div class="col-12">
        <ul class="pagination float-right">
          {% if page_obj.has_previous %}
            <li class="page-item"><a class="page-link" href="?{% url_replace request 'page' page_obj.previous_page_number %}">&laquo;</a></li>
          {% else %}
            <li class="page-item disabled"><span class="page-link">&laquo;</span></li>
          {% endif %}
          {% for i in paginator.page_range %}
            {% if page_obj.number == i %}
              <li class="active page-item"><span class="page-link">{{ i }} <span class="sr-only">(current)</span></span></li>
            {% else %}
              <li class="page-item"><a class="page-link" href="?{% url_replace request 'page' i %}">{{ i }}</a></li>
            {% endif %}
          {% endfor %}
          {% if page_obj.has_next %}
            <li class="page-item"><a class="page-link" href="?{% url_replace request 'page' page_obj.next_page_number %}">&raquo;</a></li>
          {% else %}
            <li class="page-item disabled"><span class="page-link">&raquo;</span></li>
          {% endif %}
        </ul>
      </div>
    </div>
 {% endif %}
...