rudiq
@rudiq
django fan

Вывод QuerySet учитывая 2 фактора?

Вообщем ,я новичек в Django. К сути.. Есть сайт(интернет-магазин), на главной странице которого есть его, скажем так, товары. Их можно сортировать по категориям. Так же на главной странице есть пагинация (Нумерация страниц) Что бы не загружать браузер, за 1 раз должно выводиться по 9 товаров. Вопрос : Как правильно настроить пагинацию, что бы учитывать Категорию товара, как правильно получить
products

Накидал примерно
view.py

def productlist(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True)
    paginator = Paginator(products, 6)
    page = request.GET.get('page')
    template = 'shop/product/list.html'
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=category)
    try:
        products = paginator.page(page)
    except PageNotAnInteger:
        products = paginator.page(1)
    except EmptyPage:
        products = paginator.page(paginator.num_pages)
    context = {
        'category': category,
        'categories': categories,
        'products': products,
        'page': page
    }
    return render(request, template, context)


А вот модель

class Product(models.Model):
    category = models.ForeignKey(
        Category,
        related_name='products',
        verbose_name='Категорія'
    )
    name = models.CharField(
        max_length=256,
        db_index=True,
        verbose_name='Назва'
    )
    slug = models.SlugField(
        max_length=256,
        db_index=True
    )
    image = models.ImageField(
        upload_to='prod_img/',
        blank=True,
        verbose_name='Зображення'
    )
    desc = models.TextField(
        blank=True,
        verbose_name='Опис'
    )
    price = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        verbose_name='Ціна'
    )
    stock = models.PositiveIntegerField(
        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']
        index_together = [
            ['id', 'slug']
        ]
        verbose_name = 'Товар'
        verbose_name_plural = 'Товари'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shop:ProductDetail', args=[self.id, self.slug])


Картинка для лучшего понимания
5b8c0e26e77fa846256658.jpeg
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Stormwalker
Если вы хотите иметь одно view для отфильтрованных и нефильтрованых товаров, то вам нужно раньше проверять категорию в аргументах. А еще я бы перенес page в аргументы view.
Ответ написан
Комментировать
@vikholodov
paginator = Paginator(products, 6) опусти ниже проверки if category_slug. Пагинатору пофигу какой Queryset обрабатывать, поэтому, если сработает проверка, то в пагинатор попадет отфильтрованные товары, если нет, то нет =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы