Как отсортировать товары в Django?

Есть страница с товарами. Я создал форму, чтобы пользователь мог сортировать товары. Подскажите, как сделать так чтобы товары сортировались способом, который выбрал юзер в форме ?

models.py

class Product(models.Model):
category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE, verbose_name='Категория')
name = models.CharField(max_length=200, db_index=True, verbose_name='Название')
slug = models.SlugField(max_length=200, db_index=True)
image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True, verbose_name='Фото')
description = models.TextField(blank=True, verbose_name='Описание')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Цена')
available = models.BooleanField(default=True, verbose_name='Наличие')
created = models.DateTimeField(auto_now_add=True, verbose_name='Создан')
updated = models.DateTimeField(auto_now=True, verbose_name='Обновлен')

class Meta:
    ordering = ('name',)

forms.py

class SortForm(forms.Form):
    sort_form = forms.TypedChoiceField(label='Сортировать:', choices=[('ПУ', 'По умолчанию'), ('ДТ', 'По дате'), ('ДЕД', 'От дешевых к дорогим'), ('ДОД', 'От дорогих к дешевым')])

кусочек кода во views.py

sort_form = SortForm()
products = Product.objects.filter(available=True)

кусочек кода в шаблоне product_list.html

<form action="{% url 'shop:product_list' %}" method="post" class="sort-form">
  {{ sort_form }}
  <p><input type="submit" name="sort" value="Сортировать"></p>
  {% csrf_token %}
</form>

Ответы (1 шт):

Автор решения: Andrey Maslov

в твоем views.py файле добавь варианты сортировки в зависимости от того, что выбрал пользователь.

sort_form = SortForm(request.POST) 
products = Product.objects.filter(available=True)
if sort_form.is_valid():
    needed_sort = sort_form.cleaned_data.get("sort_form")
    if needed_sort == "ДТ":
        products = products.order_by("created")#или updated  в зависимости от того, что ты вкладываешь в понятие по дате
    elif needed_sort == "ДЕД":
        products = products.order_by("price")
    elif needed_sort == "ДОД":
        products = products.order_by("-price")

можно сделать маппинг для сортировок

sort_mapping = {
  "ДЕД": "price",
  "ДОД": "-price",
  "ДТ": "created",
  "ПУ": "name",
}

тогда сортировки можно будет сделать следующим образом:

sort_form = SortForm(request.POST) 
products = Product.objects.filter(available=True)
if sort_form.is_valid():
    needed_sort = sort_form.cleaned_data.get("sort_form")
else:
    needed_sort = "ПУ"
products = products.order_by(sort_mapping.get("needed_sort", "name"))#вместо name нужно указать твой вариант сортировки по умолчанию
→ Ссылка