NSProject30 апреля 2022 г. 23:04

Django MPTT вывод дерева категорий

Django

Здраствуйте похоже я так и не понял всю суть Django-MPTT батарейки. Так как не могу решить простую задачу с выводом категорий. По этому обращаюсь к вам за помощью.
Начну с начала. Изначально я пытался сделать древовидную структуру просто в Django, но просидев до утра понял что оно того не стоит и удалил несколько строк кода.
Так как отображение мне нужно на всех страницах сайта то эту функцию я запихал в контекст.
Зарывшись в гугл и яндекс были найдены примитивные рецепты. В принципе документация на MPTT. Думаю вот оно то что искал ну и вот три дня мучаюсь с этими деревьями.
Код models.py:

class Category(MPTTModel):
    name = models.CharField('Category', max_length=50)
    slug = models.SlugField('Category Slug', max_length=50, unique=True)
    parent = TreeForeignKey('self', verbose_name='Parent Category', on_delete=models.PROTECT, db_index=True, null=True, blank=True, related_name='category_children')
    is_published = models.BooleanField(default=False)

    def __str__(self):
        return self.name

    class MPTTMeta:
        order_insertion_by = ['name']

    class Meta:
        verbose_name = 'Category'
        verbose_name_plural = 'Categories'

Простенькая такая модель. И вот на основе её у меня не получается создать дерево примерно такого вида:

При написании своего костыля у меня получилось вот какое вот чудище:

{% for category in category_list %}
            {% if category.base == True %}
                <li class="side-nav-title side-nav-item"> {{ category.name }}</li>
                {%  if category.category_children.count != 0  %}
                    {% for catego in category.category_children.all %}
                            <li class="side-nav-item">
                                {% if catego.category_children.count != 0 %}
                                        <a data-bs-toggle="collapse" href="#{{ catego.name }}" aria-expanded="false" aria-controls="sidebarTasks" class="side-nav-link">
                                            <i class="uil-clipboard-alt"></i>
                                            <span> {{ catego.name }} </span>
                                            <span class="menu-arrow"></span>
                                        </a>
                                        <div class="collapse" id="{{ catego.name }}">
                                            <ul class="side-nav-second-level">
                                                {% for item in catego.category_children.all %}
                                                <li>
                                                    <a href="apps-tasks.html">{{ item.name }}</a>
                                                </li>
                                                {% endfor %}
                                            </ul>
                                        </div>
                                    </li>
                               {% else %}
                                        <a href="#" class="side-nav-link"><i class="uil-clipboard-alt"></i>
                                            <span> {{ catego.name }} </span></a>
                                    </li>
                                {% endif %}
                    {% endfor %}
                {% endif %}
            {% endif %}
        {% endfor %}

Нехватает рекурсии. Так вот и вопрос как это всё реализовать при помощи mptt django и их кода. А то я понять не могу

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Card image cap
Pulsum Via

Проект для путешественников от EVILEG.

Перейти
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
Поделиться в социальных сетях
Donate

Проект EVILEG перешёл на некоммерческую основу и будет развиваться исключительно на энтузиазме создателя сайта, энтузиазме пользователей, пожертвованиях и реферальной системе хостинга

Спасибо за вашу поддержку

Доступные способы поддержки проекта

PayPal

PatreonYooMoneyПодробнее
M

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
k

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
k

C++ - Тест 002. Константы

  • Результат:58баллов,
  • Очки рейтинга-2
Последние комментарии
Ds

Android и QML - Добавление Splash Screen

Интересен формат иконки, если это png, то как решается проблема scalability? не растягивается ли лого на китайфонах с 1280х2500? У меня просто сплеш скрин с градиентом и логотипом, и вот несколь…
p

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

FIGURE Abdominopelvic regions. Zjuaqd https://newfasttadalafil.com/ - Cialis Cialis Recommendations for preparing children and adolescents for invasive cardiac procedures a statement…
КГ

Как использовать вложенные формы в Django

Спасибо за полезную статью. Подскажите пожалуйста, что делать если нужно реализовать большее количество вложенных форм? Например если на модель Address ссылается fk другой модели, на котору…

Qt/C++ - Урок 051. QMediaPlayer - Аудио плеер на Qt

Не думаю, QMediaPlayer в один поток проигрывает. Если вам нужно одновременное воспроизведение нескольких аудиоисточников, то вам нужна Bass audio library , насколько знаю, её обычно и…
АГ

Qt/C++ - Урок 051. QMediaPlayer - Аудио плеер на Qt

есть такая вообще возможность ?
Сейчас обсуждают на форуме
АБ

Sorting the added QML elements in the ListModel

I am writing an alarm clock in QML, I am required to sort the alarms in ascending order (depending on the date or time (if there are several alarms on the same day). I've done the sorting …

Изменение поведения QGroupBox при клике на его чекбокс

Я вынес виджеты вынес за пределы QGroupBox в итоге.

QSqlRelatipnalTabelModel Qt 4.8.1 как получить id внешней связи?

Есть еще принципиально другой вариант решить раз и навсегда вопрос с полей id внешней связи. Это форкнуть Qt 4.8.1 QSqlTableModel, то есть создать свою ветку развития. Например создадим кл…

Добавление AndroidManifest.xml в cmake

Добрый день. Как добавить AndroidManifest.xml в cmake? Это не работвет set(ANDROID_PACKAGE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/android CACHE INTERNAL "")set(ANDROID_BUID_DIR ${CMAKE_C…
s

Событие wheelEvent для виджета QLineEdit

вот что получилось: gui.py from PyQt5 import QtCore, QtGui, QtWidgets class LineEdit(QtWidgets.QLineEdit): def wheelEvent(self, event): #print("_") delta = 1 if e…
О нас
Услуги
© EVILEG 2015-2022
Рекомендует хостинг TIMEWEB