Пытаюсь сделать сортировку товаров. Застрял на одном моменте.
Предположим, у товара есть какая-то дефолтная цена (default_price), и акционная (default_action_price).
Сделать сортировку по дефолтной цене - просто. Но я хочу включить в эту сортировку акционную цену. Но так как акционная цена есть не у всех товаров - задание усложняется. В общем, я хочу сделать проверку - если у товара есть акционная цена - сделать её дефолтной и дальше уже сортировать по этому параметру. Также нужно, чтобы эта сортировка сохранялась при переходе на следующую страницу.
forms.py
class SortingForm(forms.Form):
products = Product.objects.all()
ordering = forms.ChoiceField(label="сортировка", required=False, choices=[
['shown_name', 'name'],
['-shown_name', '-name'],
['default_price', 'price'],
['-default_price', '-price'],
])
for product in products:
print(product.shown_name, product.default_price)
views.py
def products_list_view(request, slug1, slug2):
categories = Category.objects.all()
category = Category.objects.filter(slug=slug1)
for category_item in category:
category_item.slug = category_item.slug
subcategory = Subcategory.objects.filter(slug=slug2)
products = Product.objects.filter(subcategory=subcategory)
for subcategory_item in subcategory:
subcategory_item.slug = subcategory_item.slug
form = SortingForm(request.GET)
for product in products:
if product.default_action_price:
product.default_price=product.default_action_price
if form.is_valid():
if form.cleaned_data['ordering']:
products = products.order_by(form.cleaned_data['ordering'])
for product in products:
# if product.default_action_price:
# product.default_price=product.default_action_price
print(product.shown_name, product.default_price)
paginator = Paginator(products, 1)
page = request.GET.get('page')
try:
productpages = paginator.page(page)
except PageNotAnInteger:
productpages = paginator.page(1)
except EmptyPage:
productpages = paginator.page(paginator.num_pages)
context = {
'categories': categories,
'subcategory': subcategory,
'products': products,
'category_item_slug': category_item.slug,
'subcategory_item_slug': subcategory_item.slug,
'productpages': productpages
}
return render(request, 'products/products_list.html', context)
pagination
<ul class="pagination pull-right">
{% if productpages.has_previous %}
<li><a href="?page=1">«</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 }}">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if productpages.has_next %}
<li><a href="?page={{ productpages.paginator.num_pages }}">»</a></li>
{% endif %}
</ul>
sorting
<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>