Django Объекты фильтра ListView - PullRequest
1 голос
/ 20 июня 2020

У меня простая структура Shop_list -> Product_list -> Product_detail

Я хочу отфильтровать объект класса Product по полю slug, но я не вижу продуктов.

Думаю, что проблема в get_queryset()

views.py

class HomePageView(ListView):
    model = Shop
    template_name = 'blog/shop_list.html'
    page_kwarg = 'shop'
    context_object_name = 'shops'


class ProductListView(ListView):
    model = Product
    template_name = 'blog/product_list.html'
    page_kwarg = 'product'
    context_object_name = 'products'

    def get_queryset(self):
        pattern = str(self.request)
        pattern = pattern[1:]
        slug = self.model.shop
        return Product.objects.filter(shop__slug=pattern)


def produt_detail(request, **kwargs):
    print(request)
    product = get_object_or_404(Product, pk=kwargs["pk"])
    return render(request, 'blog/product_detail.html', {'product': product})

models.py

class Shop(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(blank=True)
    slug = models.SlugField(null=False, default="Shop")

    def get_absolute_url(self):
        return reverse('product_list', kwargs={'slug': self.slug})


class Product(models.Model):
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE, related_name="shop")
    title = models.CharField(max_length=200)
    price = models.CharField(max_length=200)
    period_start = models.DateTimeField(blank=True, null=True)
    period_end = models.DateTimeField(blank=True, null=True)

    def get_absolute_url(self):
        return reverse('product_detail', kwargs={'slug': self.shop.slug, 'pk': self.pk})

urls.py

urlpatterns = [
    path('', HomePageView.as_view(), name='shop_list'),
    path('<slug:slug>', ProductListView.as_view(), name='product_list'),
    path('<slug:slug>/<int:pk>/', views.produt_detail, name='product_detail'),
]

product_list. html

{% for product in products %}
    <a href="{% url 'product_detail' product.shop.slug product.shop.pk %}">
   ...

1 Ответ

3 голосов
/ 20 июня 2020

Вы фильтруете с помощью:

class ProductListView(ListView):
    model = Product
    template_name = 'blog/product_list.html'
    page_kwarg = 'product'
    context_object_name = 'products'

    def get_queryset(self):
        return Product.objects.filter(<b>shop__slug=self.kwargs['slug']</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...