Список товаров из данной категории - PullRequest
0 голосов
/ 05 февраля 2020

Я только начинаю, и у меня проблема. Я хочу получить в
SlugView список всех продуктов в данной категории ('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")

Список ошибок: '' 'Запуск сервера разработки с http://127.0.0.1: 8000 / Завершите работу сервера с помощью 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 / category HTTP / 1.1» 200 997 Внутренняя ошибка сервера: / Categories / 1234D Traceback (последний вызов был последним): Файл »/ home / marekk / Pulpit / kurs / Django_cwicz / venv / lib / python3 .6 / site-packages / django / template / base.py ", строка 828, в _resolve_lookup current = current [бит] TypeError: объект 'Product' недопустим

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

'' '

Вот вам шаблоны.

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>

' ''

Проблема в этой части кода, но я не знаю почему:

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

def __str__(self):
    return self.name

в этом строка (это строка 88 в models.py)

возвращает "Nazwa: {}, cena: {}". format (self.name, self.price)

сообщения об ошибках:

Метод запроса: GET URL запроса: http://127.0.0.1: 8000 / category / 1234 C Django Версия: 3.0 Тип исключения: RecursionError Exception Valu e:

превышена максимальная глубина рекурсии при вызове объекта Python

Местоположение исключения: / home / marekk / Pulpit / kurs / django -za2 / WAR_PYT_W_11_Zaawansowane_Django / 3_Django / coderslab / упражнения /models.py в имени, строка 88

для views.py Я добавил:

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

к шаблону, который я добавил:

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

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Сначала получите категорию, используя метод get() вместо filter(), поскольку get возвращает одиночный объект, тогда как filter возвращает набор запросов. Затем вы можете получить связанные продукты в такую ​​категорию.


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

И здесь я изменил название вашего класса на CategoryView вместо SlugView для лучшего понимания.

1 голос
/ 05 февраля 2020

Поскольку ваша цель - получить Products через Category, вы можете фильтровать записи, относящиеся к M2M:

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