Reputation: 3
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
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
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