dzhem911
@dzhem911
I know H.T.M.L. ;)

Как динамически отображать query_set() в одном шаблоне?

Не очень понимаю, как правильно переопределить get_query_set(). Нужно отобразить все категории на главной странице, но при переходе пользователя по ссылке на интересующую категорию, отображать только элементы входящие в эту категорию. Таблицы связаны. Нужна помощь, долго пытаюсь реализовать. Смотрел в док, но безуспешно. Ниже код:
#models

class Category(models.Model):
    name = models.CharField(verbose_name='Категория', max_length=100, db_index=True)
    slug = models.SlugField(max_length=100, db_index=True,
                            unique=True)
...
    def get_absolute_url(self):
        return reverse('core:product_list_by_categories',
                       args=[self.slug])


class Product(models.Model):
    vencode = models.CharField('Артикул', max_length=100, primary_key=True)
    slug = models.SlugField(max_length=100, db_index=True)
    describe = models.TextField('Описание', blank=True)
    price = models.DecimalField('Цена', max_digits=20, decimal_places=2)
    category = models.ForeignKey('Category', related_name='products', on_delete=models.SET_NULL,
                               null=True, verbose_name='Категория')
    available = models.BooleanField(default=True)

    class Meta:
        index_together = (('vencode', 'slug'),)

    def get_absolute_url(self):
        return reverse('core:product_detail', args=[str(self.slug)])

    def save(self, *args, **kwargs):
        self.slug = slugify(self.vencode, allow_unicode=True)
        super(Product, self).save(*args, **kwargs)

# urls
app_name = 'core'

urlpatterns = [
    path('', views.ProductView.as_view(), name='products'),
    path('categories/<slug:category_slug>/',
            views.ProductView.as_view(),
            name='product_list_by_categories'),]

#views

class ProductView(generic.ListView):
    ...
    categories = Category.objects.

    def get_queryset(self, category_slug=None):
        self.category = None
        if category_slug:
            self.category = get_object_or_404(Category, slug=category_slug)
            return Product.objects.filter(category=self.category)
        return Product.objects.filter(available=True)

    def get_context_data(self, **kwargs):
        context = super(ProductView, self).get_context_data(**kwargs)
        context['Products'] = self.form_class
        context['categories'] = self.categories
        #context['category'] = self.category
        return context

#html
<h3>Categories</h3>

          <li {% if not category %}class="selected"{% endif %}>
                    <a href="{{ categories.get_absolute_url }}">Все категории</a>
          </li>
          {% for c in categories %}
          <li {% if categories.slug == c.slug %}class="selected"{% endif %}>
                    <a href="{{ c.get_absolute_url }}">{{ c.name }}</a>
          </li>
          {% endfor %}
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
@Realmixer
Full stack Python (Django) web-developer
У метода get_queryset возможен только один аргумент — self. Чтобы внутри этого метода получить category_slug тебе нужно обращаться к self.kwargs — в этом словаре находятся все переменные, которые ты определил в urls. То есть твой код должен выглядеть примерно так:
def get_queryset(self):
    self.category = None
    if 'category_slug' in self.kwargs:
        self.category = get_object_or_404(Category, slug=self.kwargs['category_slug'])
        return Product.objects.filter(category=self.category)
    return Product.objects.filter(available=True)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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