Как отсортировать товары в 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 нужно указать твой вариант сортировки по умолчанию