@Ral1ver

Как сделать обратное разрешение url адресов Djnago MPTT?

У меня есть список категорий с подкатегориями. Не знал как сделать подкатегории чтоб не создавать отдельную модель и наследоваться к ней. Пошел в гуглить писали про библиотеку Django mptt успешно ее импортировал в проект и радовался до момента пока не понял что у меня не получается сделать обратное разрешение url адресов по полю slug так как его просто нет ибо поле с подкатегориями наследуется от сомой себя. Гуглил но без результата. Как сделать чтоб была сортировка товаров по подкатегориям. Может есть другие библиотеки или другое решение. Это учебный проект я только учусь сори если тупой вопрос и спасибо заранее

Код модели:
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey #Для древовидного структурирования


class Category(MPTTModel, models.Model):
    name = models.CharField(max_length=150, unique=True, verbose_name='Имя категории')
    slug = models.SlugField(max_length=200, unique=True, blank=True, null=True, verbose_name='URL')
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='subcatery', verbose_name='Под категория')

    class Meta:
        db_table = 'category' # Переименнование таблицы в базе данных
        verbose_name = 'Категорию'
        verbose_name_plural = 'Категории'

    class MPTTMeta:
        order_insertion_by = ['name'] # Определяет порядок, в котором дочерние элементы будут добавляться в дерево
        
        
    def __str__(self):
        return self.name


Код urls главного приложения:
from django.urls import include, path 
from django.contrib import admin
from django.conf.urls.static import static

from app import settings


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('main.urls', namespace='main')),
    path('catalog/', include('goods.urls', namespace='goods')),
]


if settings.DEBUG:
    urlpatterns += [
        path('__debug__/', include('debug_toolbar.urls')) #Подключение toolbara
    ]
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


Код url созданного приложения:
from django.urls import path
from goods.views import catalog, product


app_name = 'goods'

urlpatterns = [
    path('', catalog, name='catalog'),
    path('product/<slug:product_slug>/', product, name='product'),  #Обратное разрешение url адресов 
]


Код views:
from django.shortcuts import render

from goods.models import Product, Category


def catalog(request):

    products = Product.objects.all()
    categories = Category.objects.all()

    context = {
        'title': 'Suruchi - Shop',
        'categories': categories,
        'products': products,
    }
    return render(request, 'goods/shop.html', context)


Кусок кода из html куда вставляются категории:
<div class="offcanvas__filter--sidebar__inner">
    <div class="single__widget widget__bg">
      <h2 class="widget__title h3">Categories</h2>
      <ul class="widget__categories--menu">
        {% recursetree categories %}
          <li class="widget__categories--menu__list">
            <label class="widget__categories--menu__label d-flex align-items-center">
              <span class="widget__categories--menu__text">{{ node.name }}</span>
              <svg class="widget__categories--menu__arrowdown--icon" xmlns="http://www.w3.org/2000/svg" width="12.355" height="8.394">
                <path d="M15.138,8.59l-3.961,3.952L7.217,8.59,6,9.807l5.178,5.178,5.178-5.178Z" transform="translate(-6 -8.59)" fill="currentColor"></path>
              </svg>
            </label>
            {% if not node.is_leaf_node %}
              <ul class="widget__categories--sub__menu">
                  {% for child in node.get_children %}
                    <li class="widget__categories--sub__menu--list">
                      <a class="widget__categories--sub__menu--link d-flex align-items-center" href="{% url "goods:catalog" %}">
                        <span class="widget__categories--sub__menu--text">{{ child.name }}</span>
                      </a>
                    </li>
                  {% endfor %}
              </ul>
            {% endif %}
          </li>
        {% endrecursetree %}
      </ul>
    </div>


Картинка как это выглядит на сайте
66a699cf3466b950803581.png

Картинка как это выглядит в админке
66a69b3469b34318886742.png
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
так как его просто нет
а почему у тебя нет поля slug, если оно важно? почему ты его сделал blank=True, null=True, хотя по логике оно всегда должно быть заполнено? В итоге ты сам себе на ровном месте создал проблему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы