Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 22.02.2021
Сообщений: 1

Проблема с построением URl шаблонов, при многоуровневом дереве каталогов товара

22.02.2021, 17:21. Показов 1609. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь организовать каталог товаров с категориями подкатегориями и группами. Дерево выглядит следующим образом:
Категория 1
подкатегория 1
группа 1
и так далее.
Шаблоны URL формируются по слагу категорий. Отобразить в html шаблоне категории и подкатегории получилось. А с группами не сростается. А когда кликаю по подкатегории в которой есть вложенные группы вылетает ошибка
Exception Value: 'NoneType' object has no attribute 'slug'
конкретно ругается на метод модели Exception Location: D:\Projects\my_project\my_market\store\m odels.py, line 64, in get_absolute_url

P.S.
Ну и как говориться "Не судите строго") Учусь сам на форумы пишу только по крайней необходимости. Если что то не так здоровую критику принимаю нормально) Заранее всем спасибо

models.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from django.db import models
from django.urls import reverse
 
 
class Category(models.Model):
    parent = models.ForeignKey('self', on_delete=models.CASCADE,
                               null=True)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=220, unique=True)
 
    class Meta:
        ordering = ('name',)
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'
 
    def __str__(self):
        return self.name
 
    def get_absolute_url(self):
        return reverse('store:product_list_by_category', args=[self.slug])
 
 
class SubCategory(models.Model):
    parent_category = models.ForeignKey(Category,
                                        related_name='subcategories',
                                        on_delete=models.CASCADE)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=220, unique=True)
 
    class Meta:
        ordering = ('name',)
        verbose_name = 'Подкатегория'
        verbose_name_plural = 'Подкатегории'
 
    def __str__(self):
        return self.name
 
    def get_absolute_url(self):
        return reverse('store:product_list_by_subcategory',
                       args=[self.parent_category.slug, self.slug])
 
 
class Group(models.Model):
    parent_category = models.ForeignKey(Category,
                                        related_name='groups_category',
                                        on_delete=models.CASCADE,
                                        null=True)
    parent_subcategory = models.ForeignKey(SubCategory,
                                           related_name='groups',
                                           on_delete=models.CASCADE)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=220, unique=True)
 
    class Meta:
        ordering = ('name',)
        verbose_name = 'Группа'
        verbose_name_plural = 'Группы'
 
    def __str__(self):
        return self.name
 
    def get_absolute_url(self): 
        return reverse('store:product_list_by_group',  #64 строка с ошибкой
                       args=[self.parent_category.slug,
                             self.parent_subcategory.slug,
                             self.slug])
 
 
class Product(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=220, unique=True)
    subcategory = models.ForeignKey(SubCategory,
                                    related_name='products',
                                    on_delete=models.CASCADE,
                                    blank=True,
                                    null=True)
    group = models.ForeignKey(Group,
                              related_name='products_group',
                              on_delete=models.CASCADE,
                              blank=True,
                              null=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(decimal_places=2, max_digits=10)
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
 
    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)
        verbose_name = 'Товар'
        verbose_name_plural = 'Товары'
 
    def __str__(self):
        return self.name
 
    def get_absolute_url(self):
        return reverse('store:product_detail', args=[self.id, self.slug])
views.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from django.shortcuts import render, get_object_or_404
from store.models import Product, Group, SubCategory, Category
 
 
def product_list(request, category_slug=None, subcategory_slug=None, group_slug=None):
    category = None
    categories = Category.objects.all()
    subcategory = None
    subcategories = None
    group = None
    groups = None
    products = Product.objects.filter(available=True)
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        subcategories = category.subcategories.all()
        if subcategory_slug:
            subcategory = get_object_or_404(SubCategory, slug=subcategory_slug)
            products = products.filter(subcategory=subcategory)
            groups = subcategory.groups.all()
            if group_slug:
                group = get_object_or_404(Group, slug=group_slug)
                products = products.filter(group=group)
    return render(request, 'store/product/list.html',
                  {'category': category,
                   'categories': categories,
                   'products': products,
                   'subcategory': subcategory,
                   'subcategories': subcategories,
                   'group': group,
                   'groups': groups})
 
 
def product_detail(request, id, slug):
    product = get_object_or_404(Product, id=id, slug=slug, available=True)
    return render(request, 'store/product/detail.html', {'product': product})
urls.py приложения
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from django.urls import path
from . import views
app_name = 'store'
urlpatterns = [
    path('', views.product_list, name='product_list'),
    path('<slug:category_slug>/', views.product_list, name='product_list_by_category'),
    path('<int:id>/<slug:slug>/', views.product_detail, name='product_detail'),
    path('<slug:category_slug>/<slug:subcategory_slug>/',
         views.product_list, name='product_list_by_subcategory'),
    path('<slug:category_slug>/<slug:subcategory_slug>/<slug:group_slug>/',
         views.product_list, name='product_list_by_group'),
 
]
list.html
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{% extends "store/base.html" %}
{% load static %}
{% block title %}
    {% if category %}{{ category.name }}{% else %}Products{% endif %}
{% endblock %}
{% block content %}
    <div id="sidebar">
        <h3>Categories</h3>
        <ul>
            <li{% if not category %} class="selected" {% endif %}>
                <a href="{% url "store:product_list" %}">All</a>
            </li>
            {% for  c  in categories %}
                <li {% if category.slug == c.slug %} class="selected" {% endif %}>
                    <a href="{{ c.get_absolute_url }}">{{ c.name }}</a>
                </li>
                <ul>
                    {% for  sub in subcategories %}
                        {% if c.id == category.id %}
                            <li {% if subcategory.slug == sub.slug  %} class="selected" {% endif %}>
                                <a href="{{ sub.get_absolute_url }}"> ►{{ sub.name }}</a>
                            </li>
                        {% endif %}
                        <ul>
                            {% for  g in groups %}
                                {% if subcategory.id == sub.id %}
                                    <li {% if group.slug == g.slug  %} class="selected" {% endif %}>
                                        <a href="{{ g.get_absolute_url }}"> ►►{{ g.name }}</a>    # ссылается на get_absolute_url                                               </li>
                                {% endif %}
                            {% endfor %}
                        </ul>
                    {% endfor %}
                </ul>
            {% endfor %}
        </ul>
    </div>
    <div id="main" class="product-list">
        <h1>{% if category %}{{ category.name }}{% else %}Products{% endif %}</h1>
        {% for product in products %}
            <div class="item">
                <a href="{{ product.get_absolute_url }}">
                    <img src="{% if product.image %}{{ product.image.url }}
                    {% else %}{% static "img/no_image.png" %}{% endif %} ">
                </a>
                <a href="{{ product.get_absolute_url }}">{{ product.name }}</a>
                <br>
                ${{ product.price }}
            </div>
        {% endfor %}
    </div>
{% endblock %}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2021, 17:21
Ответы с готовыми решениями:

SEO URL - ошибка в при добавлении товара в корзину
Здравствуйте! Может тут мне поможет кто-то. По инструкциями включил возможность использования SEO URL (настройки - система - сервер -...

Как применить команду ко всем файлам в дереве каталогов?
Директория известна - я в ней нахожусь. Надо применить скрипт, где аргумент команда, который эту команду, собственно, применил бы ко всем...

Как в дереве каталогов найти файлы, принадлежащие заданному пользователю?
Написать скрипт, находящий в заданном каталоге и всех его подкаталогах все файлы, владельцем которых является заданный ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2021, 17:21
Помогаю со студенческими работами здесь

R-Studio: что означают иконки-крестики в дереве распознанных каталогов/файлов?
Почти у каждого элемента дерева такая иконка:

Как вернуться на один уровень вверх в дереве каталогов в файловом менеджере
Здравствуйте! Вопрос: Работаю я значит с файлами и папками делаю Аля тотал камандера подобию и уперся в такую штуковину, Файлы и папки...

Проблема с построением графика
Здравствуйте. Возникла проблема с построением графика в MathCad. Все уравнения, вроде как, записаны правильно (некоторые различия в...

Проблема с построением запроса к бд
Доброго времени суток. Проблема такова, имеются две таблицы (работники, журнал посещений). Журнал имеет поля: id_worker, date, status....

Проблема с построением графика
Подскажите, пожалуйста, метод правильного построения графиков с помощью мыши. Использовал функцию MouseDrag, но уже при среднем темпе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru