Форум сайта python.su
Реализовал сортировку и пагинацию (на Джанго 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 > High)</option> <option value="-default_action_price">Price (High > 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 }}">«</a></li> {% else %} <li class="disabled"><span>«</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 }}">»</a></li> {% else %} <li class="disabled"><span>»</span></li> {% endif %} </ul> {% endif %} </div> </div>
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)
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)'], ])
url(r'^(?P<slug>[\w-]+)$', index, name="products_list"),
Офлайн
<li><a href="?page={{ productpages.previous_page_number }}">«</a></li>
<li><a href="?page={{ productpages.previous_page_number }}&sorting={{sorting}}">«</a></li>
Офлайн
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}}">«</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}}">»</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)
Офлайн
FishHook, помогите… никак не могу пофиксить
Офлайн
m0nte-cr1st0Сформированный где и чем? У вас куча ссылок в шаблоне, да еще и форма. Какая из ссылок лагает? Или это сабмит формы такой урл запрашивает? Если это запрос от формы, то вам надо в форму добавить скрытое поле с номером страницы.
сформированный url выглядит подобным образом
Офлайн
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)
Офлайн
m0nte-cr1st0Что значит “как-то”? У вас ГЕТ-форма, гет помещает параметры запроса в УРЛ, именно поэтому там есть ordering=-shown_name т.к. в форме есть name=“ordering”. Очевидно, вам надо добавить поле с нужным name и значением в форму.
Нужно как-то передавать в неё, например “page=1&” после “?”.
<form action="" method="GET">
<input type="hidden" name="page" value="{{page}}"/>
Офлайн
FishHook спасибо большое. теперь буду знать, как передавать параметры в get…
Офлайн
в коде можно сделать так.
page = request.GET.get('page', 1)
Офлайн