Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Сбивается сортировка при переходе на другую страницу [RSS Feed]

#1 Фев. 13, 2019 18:51:56

m0nte-cr1st0
Зарегистрирован: 2019-02-03
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

Реализовал сортировку и пагинацию (на Джанго 1.11). Всё работает, но как только переходишь на другую страницу - сортировка сбивается.
Я понимаю, что сбивается url, но не знаю, как это исправить. Искать буду долго. А так подскажет кто, может.

               <div class="pull-right">
                  <form action="" method="GET">
                    <select class="form-control input-sm" name="ordering" id="id_ordering" onchange='this.form.submit()'>
                      <option value="" selected="selected">Default</option>
                      <option value="name">Name (A-Z)</option>
                      <option value="-name">Name (Z-A)</option>
                      <option value="default_action_price">Price (Low &gt; High)</option>
                      <option value="-default_action_price">Price (High &gt; Low)</option>
                      <option value="rating">Rating (Highest)</option>
                      <option value="-rating">Rating (Lowest)</option>
                    </select>
                      <noscript><input type="submit" value="Submit"></noscript>
                    </form>
                </div>

пагинация
 <div class="row">
              <div class="col-md-4 col-sm-4 items-info">Items {{ start_index }} to {{ end_index }} of {{ all_products_count }} total</div>
              <div class="col-md-8 col-sm-8">
                {% if productpages.has_other_pages %}
                  <ul class="pagination pull-right">
                    {% if productpages.has_previous %}
                      <li><a href="?page={{ productpages.previous_page_number }}">&laquo;</a></li>
                    {% else %}
                      <li class="disabled"><span>&laquo;</span></li>
                    {% endif %}
                    {% for i in productpages.paginator.page_range %}
 
                      {% if productpages.number == i %}
                        <li><span>{{ i }} <span class="sr-only">(current)</span></span></li>
                      {% else %}
                        <li><a href="?page={{ i }}">{{ i }}</a></li>
                      {% endif %}
                    {% endfor %}
                    {% if productpages.has_next %}
                      <li><a href="?page={{ productpages.next_page_number }}">&raquo;</a></li>
                    {% else %}
                      <li class="disabled"><span>&raquo;</span></li>
                    {% endif %}
                  </ul>
                {% endif %}
 
            </div>
          </div>

views.py
 def index(request, slug, page_number=1):
    categories = Category.objects.all()
    subcategories = Subcategory.objects.all()
    category_item = Subcategory.objects.filter(slug=slug)
    all_products = Product.objects.all()
 
    page = request.GET.get('page', 1)
    paginator = Paginator(all_products, 2)
 
    try:
        productpages = paginator.page(page)
    except PageNotAnInteger:
        productpages = paginator.page(1)
    except EmptyPage:
        productpages = paginator.page(paginator.num_pages)
 
    form = FilterForm(request.GET)
 
    if form.is_valid():
        if form.cleaned_data["ordering"]:
            all_products = all_products.order_by(form.cleaned_data["ordering"])
 
    context = {
        'categories': categories,
        'subcategories': subcategories,
        'category_item': category_item,
        'productpages': productpages,
        'all_products_count': all_products.count(),
        'start_index': productpages.start_index(),
        'end_index': productpages.end_index(),
    }
    return render(request, 'products_list.html', context)

forms.py
 from django import forms
 
 
class FilterForm(forms.Form):
    ordering = forms.ChoiceField(label="сортировка", required=False, choices=[
        ['name', 'Name (A-Z)'],
        ['-name', 'Name (Z-A)'],
        ['default_action_price', 'Price (Low > High)'],
        ['-default_action_price', 'Price (High > Low)'],
        ['rating', 'Rating (Highest)'],
        ['-rating', 'Rating (Lowest)'],
    ])

urls.py
 url(r'^(?P<slug>[\w-]+)$', index, name="products_list"),

Когда делаю сортировку, страница тут же перезагружается и загружается страница с отсортированными объектами. (url включает в себя способ сортировки)
Но, когда я перехожу на другую страницу этого блока, этот фильтр с адреса url исчезает и соответственно сортировка тоже исчезает.

Офлайн

#2 Фев. 18, 2019 10:43:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

<li><a href="?page={{ productpages.previous_page_number }}">&laquo;</a></li>
Вы номер страницы передаете в представление. Это логично, представление должно знать с какой страницы делается запрос, чтобы сформировать новый HTML для нужного номера страницы. Можно догадаться, что подобным же образом можно передать и порядок сортировки.
<li><a href="?page={{ productpages.previous_page_number }}&sorting={{sorting}}">&laquo;</a></li>



Офлайн

#3 Фев. 18, 2019 13:08:54

m0nte-cr1st0
Зарегистрирован: 2019-02-03
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

FishHook, спасибо. помогли. тут ещё такой нюас есть. я немного подправил уже код. при первой перезагрузке страницы вылетает ошибка int() argument must be a string or a number, not ‘NoneType’ и сформированный url выглядит подобным образом http://127.0.0.1:8000/ru/products/cereals/rice/?ordering=-shown_name Если добавить вручную page=1, то всё работает, как положено. почему-то не передаётся сразу номер страницы(

 url(r'^(?P<slug1>[-\w]+)/(?P<slug2>[-\w]+)/$', products_list_view, name='products_list_view')
 ordering = request.GET.get('ordering')
    if ordering in ('shown_name', '-shown_name', 'default_price', '-default_price'):
        products = products.order_by(ordering)
    else:
        # отдельная костыльная сортировка
        products = list(products)
        for product in products:
            if product.default_action_price:
                product.default_price=product.default_action_price
        products = sorted(products, key=lambda x: x.default_price)
paginator = Paginator(products, 2)
    page = request.GET.get('page')
    try:
        productpages = paginator.page(page)
    except PageNotAnInteger:
        productpages = paginator.page(1)
    except EmptyPage:
        productpages = paginator.page(paginator.num_pages)

          <ul class="pagination pull-right">
                {% if productpages.has_previous %}
                  <li><a href="?page=1&ordering={{ordering}}">&laquo;</a></li>
                {% endif %}
                {% for num in productpages.paginator.page_range %}
                  {% if productpages.number == num %}
                    <li><span>{{ num }}</span>
                  {% elif num > productpages.number|add:"-3" and num < productpages.number|add:'3' %}
                    <li><a href="?page={{ num }}&ordering={{ordering}}">{{ num }}</a></li>
                  {% endif %}
                {% endfor %}
                {% if productpages.has_next %}
                  <li><a href="?page={{ productpages.paginator.num_pages }}&ordering={{ordering}}">&raquo;</a></li>
                {% endif %}
                </ul>

                 <form action="" method="GET">
                    <select class="form-control input-sm" name="ordering" id="id_ordering" onchange='this.form.submit()'>
                      <option value="" selected="selected">Default</option>
                      <option value="shown_name">name</option>
                      <option value="-shown_name">-name</option>
                      <option value="default_price">price</option>
                      <option value="-default_price">-price</option>
                    </select>
                      <noscript><input type="submit" value="Submit"></noscript>
                    </form>

Отредактировано m0nte-cr1st0 (Фев. 18, 2019 13:09:49)

Офлайн

#4 Фев. 20, 2019 19:17:23

m0nte-cr1st0
Зарегистрирован: 2019-02-03
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

FishHook, помогите… никак не могу пофиксить

Офлайн

#5 Фев. 21, 2019 05:20:29

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

m0nte-cr1st0
сформированный url выглядит подобным образом
Сформированный где и чем? У вас куча ссылок в шаблоне, да еще и форма. Какая из ссылок лагает? Или это сабмит формы такой урл запрашивает? Если это запрос от формы, то вам надо в форму добавить скрытое поле с номером страницы.



Офлайн

#6 Фев. 21, 2019 11:34:08

m0nte-cr1st0
Зарегистрирован: 2019-02-03
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

FishHook ну смотрите. При селекте у меня перезагружается страница сразу же (благодаря сабмиту). И кидает сразу же на несуществующую страницу с url http://127.0.0.1:8000/ru/products/cereals/rice/?ordering=-shown_name . Это порождает ошибку int() argument must be a string or a number, not ‘NoneType’. Но когда я вручную добавляю page=1 (получается url http://127.0.0.1:8000/ru/products/cereals/rice/?page=1&ordering=-shown_name), то всё работает исправно. При пагинации ничего не слетает.
То есть проблема именно с формой селекта, скорей всего… Нужно как-то передавать в неё, например “page=1&” после “?”.

Отредактировано m0nte-cr1st0 (Фев. 21, 2019 11:36:53)

Офлайн

#7 Фев. 21, 2019 11:46:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

m0nte-cr1st0
Нужно как-то передавать в неё, например “page=1&” после “?”.
Что значит “как-то”? У вас ГЕТ-форма, гет помещает параметры запроса в УРЛ, именно поэтому там есть ordering=-shown_name т.к. в форме есть name=“ordering”. Очевидно, вам надо добавить поле с нужным name и значением в форму.
<form action="" method="GET">
<input type="hidden" name="page" value="{{page}}"/>



Офлайн

#8 Фев. 21, 2019 11:55:37

m0nte-cr1st0
Зарегистрирован: 2019-02-03
Сообщения: 49
Репутация: +  2  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

FishHook спасибо большое. теперь буду знать, как передавать параметры в get…

Офлайн

#9 Ноя. 15, 2019 09:22:11

od-5
Зарегистрирован: 2013-08-01
Сообщения: 17
Репутация: +  1  -
Профиль   Отправить e-mail  

Сбивается сортировка при переходе на другую страницу

в коде можно сделать так.

 page = request.GET.get('page', 1)

Офлайн

  • Начало
  • » Django
  • » Сбивается сортировка при переходе на другую страницу [RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version