【问题标题】:List of products from the given category给定类别的产品列表
【发布时间】:2020-05-21 03:44:34
【问题描述】:

我才刚刚开始,但我遇到了问题。我想进去
Slug查看给定类别('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 /categories HTTP/1.1”200 997 内部服务器错误:/categories/1234D 回溯(最近一次通话最后): _resolve_lookup 中的文件“/home/marekk/Pulpit/kurs/Django_cwicz/venv/lib/python3.6/site-packages/django/template/base.py”,第 828 行 当前 = 当前[位] TypeError:“产品”对象不可下标

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

'''

这里是模板。

模板“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 %}

'''

模板“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

在这一行中(这是 models.py 中的第 88 行)

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

错误信息:

请求方法:GET 请求网址:http://127.0.0.1:8000/categories/1234C Django 版本:3.0 异常类型:递归错误 异常值:

调用 Python 对象时超出最大递归深度

异常位置:/home/marekk/Pulpit/kurs/django-za2/WAR_PYT_W_11_Zaawansowane_Django/3_Django/coderslab/exercises/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 }}

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    首先使用get()方法而不是filter()方法获取类别,因为get返回单个对象,而filter返回查询集。然后你可以得到与此类相关的产品。

    
     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}) 
     

    为了更好地理解,我在这里将你的班级名称改为CategoryView 而不是SlugView。

    【讨论】:

    • '''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})'''
    • 我有错误:'Product' 对象不可下标
    【解决方案2】:

    由于您的目标是通过Category 获得Products,因此您可以过滤M2M 相关记录:

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

    【讨论】:

    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2013-04-20
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多