marcoklk
marcoklk

Reputation: 3

List of products from the given category

I'm just getting started and I have a problem. I want to get in
SlugView a list of all products in the given category ('slug').

models.py

class Category(models.Model):
    category_name = models.CharField(max_length=64)
    slug = models.CharField(max_length=64, unique=True)

class Product(models.Model):
    name = models.CharField(max_length=128)
    description = models.TextField()
    price = models.FloatField()
    vat = models.FloatField(choices=VAT)
    stock = models.IntegerField()
    categories = models.ManyToManyField(Category)

    @property
    def name(self):
        return "Nazwa: {}, cena: {}".format(self.name, self.price)

    def __str__(self):
        return self.name

views.py

class SlugView(View):
    def get(self, request, slug):
        category = Category.objects.filter(slug=slug)
        return render(request,'exercises/slug.html', {'products': products})

urls.py

 re_path(r'categories/(?P<slug>\w+)', SlugView.as_view(), name = "slug")

Bug list: ''' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [05/Feb/2020 09:46:37] "GET / HTTP/1.1" 200 965 [05/Feb/2020 09:46:42] "GET / HTTP/1.1" 200 965 [05/Feb/2020 09:46:45] "GET /categories HTTP/1.1" 200 997 Internal Server Error: /categories/1234D Traceback (most recent call last): File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 828, in _resolve_lookup current = current[bit] TypeError: 'Product' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/marekk/Pulpit/kurs/django-za2/WAR_PYT_W_11_Zaawansowane_Django/3_Django/coderslab/exercises/views.py", line 30, in get
        return render(request,'exercises/slug.html', {'products': products})
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/shortcuts.py", line 19, in render
        content = loader.render_to_string(template_name, context, request, using=using)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/loader.py", line 62, in render_to_string
        return template.render(context, request)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/backends/django.py", line 61, in render
        return self.template.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 171, in render
        return self._render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 163, in _render
        return self.nodelist.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 936, in render
        bit = node.render_annotated(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
        return self.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/loader_tags.py", line 150, in render
        return compiled_parent._render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 163, in _render
        return self.nodelist.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 936, in render
        bit = node.render_annotated(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
        return self.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/loader_tags.py", line 62, in render
        result = block.nodelist.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 936, in render
        bit = node.render_annotated(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
        return self.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/loader_tags.py", line 62, in render
        result = block.nodelist.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 936, in render
        bit = node.render_annotated(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
        return self.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/defaulttags.py", line 209, in render
        nodelist.append(node.render_annotated(context))
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
        return self.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/loader_tags.py", line 62, in render
        result = block.nodelist.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 936, in render
        bit = node.render_annotated(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
        return self.render(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 986, in render
        output = self.filter_expression.resolve(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 670, in resolve
        obj = self.var.resolve(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 795, in resolve
        value = self._resolve_lookup(context)
      File "/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py", line 836, in _resolve_lookup
        current = getattr(current, bit)
      File "/home/marekk/Pulpit/kurs/django-za2/WAR_PYT_W_11_Zaawansowane_Django/3_Django/coderslab/exercises/models.py", line 88, in name
        return "Nazwa: {}, cena: {}".format(self.name, self.price)
      File "/home/marekk/Pulpit/kurs/django-za2/WAR_PYT_W_11_Zaawansowane_Django/3_Django/coderslab/exercises/models.py", line 88, in name
        return "Nazwa: {}, cena: {}".format(self.name, self.price)
      File "/home/marekk/Pulpit/kurs/django-za2/WAR_PYT_W_11_Zaawansowane_Django/3_Django/coderslab/exercises/models.py", line 88, in name
        return "Nazwa: {}, cena: {}".format(self.name, self.price)
      [Previous line repeated 449 more times]
    RecursionError: maximum recursion depth exceeded while calling a Python object
    [05/Feb/2020 09:46:49] "GET /categories/1234D HTTP/1.1" 500 1694912

'''

Here you are templates.

template "slug.html" '''

{% extends 'exercises/base.html' %}

{% block page_title %}
            <h1>Sklep internetowy OLABOGA.</h1>
      {% endblock %}

{% block content_title %}<h2>Produkty w kategorii:</h2>
 {% endblock %}

{% block content %}
    <ul>
        {% for product in products %}
            {% block element %}
                <li><a href='/{% block link %}product{% endblock %}/
                    {{ product.name }}'>{{ product.name }}</a></li>
            {% endblock %}
        {% endfor %}
    </ul>
{% endblock %}

'''

template "base.html" '''

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% block logo %}
        <img src="{% static 'images/logo.png' %}" alt="Tu powinno być logo" >
    {% endblock %}
   {% block page_content %}
      {% block page_title %}
            <h1>Szkoła podstawowa nr 1 im. Chucka Norrisa.</h1>
      {% endblock %}
       {% block content_title %}
                <h2>Klasy:</h2>
       {% endblock %}
       {% block content %}
                <ul>
                    {% for object in objects %}
                        {% block element %}
                            <li><a href='/{% block link %}class{% endblock %}/{}'>{}</a></li>
                        {% endblock %}
                    {% endfor %}
                </ul>
       {% endblock %}
       {% block additional %}
       {% endblock %}
   {% endblock %}
</body>
</html>

'''

Problem is in this part of code, but I don't know why:

@property
def name(self):
    return "Nazwa: {}, cena: {}".format(self.name, self.price)

def __str__(self):
    return self.name

in this row (this is line 88 in models.py)

return "Nazwa: {}, cena: {}".format(self.name, self.price)

error messages:

Request Method: GET Request URL: http://127.0.0.1:8000/categories/1234C Django Version: 3.0 Exception Type: RecursionError Exception Value:

maximum recursion depth exceeded while calling a Python object

Exception Location: /home/marekk/Pulpit/kurs/django-za2/WAR_PYT_W_11_Zaawansowane_Django/3_Django/coderslab/exercises/models.py in name, line 88

to views.py I added:

from django import template
register = template.Library()
@register.filter
def multiply(value, arg):
    return value * arg

to template I added:

{{ product.price|multiply:product.vat }}

Upvotes: 0

Views: 121

Answers (2)

Arjun Shahi
Arjun Shahi

Reputation: 7330

First get the category using the get() method instead of filter() method since get returns the single object whereas filter returns the queryset.Then you can get the related products to the category like this.


 class CategoryView(View):
    def get(self, request, slug):
        category = Category.objects.get(slug=slug)
        products = category.product_set.all()
        return render(request,'exercises/slug.html', {'products': products}) 
 

And here I changed your class name to CategoryView instead of SlugView for the better understanding.

Upvotes: 1

Charnel
Charnel

Reputation: 4432

Since your goal to get Products through Category you can filter on M2M related records:

products = Product.objects.filter(categories__slug=slug)
return render(request,'exercises/slug.html', {'products': products})

Upvotes: 1

Related Questions