NSProject
April 30, 2022, 11:04 p.m.

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

Django

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

  1. class Category(MPTTModel):
  2. name = models.CharField('Category', max_length=50)
  3. slug = models.SlugField('Category Slug', max_length=50, unique=True)
  4. parent = TreeForeignKey('self', verbose_name='Parent Category', on_delete=models.PROTECT, db_index=True, null=True, blank=True, related_name='category_children')
  5. is_published = models.BooleanField(default=False)
  6.  
  7. def __str__(self):
  8. return self.name
  9.  
  10. class MPTTMeta:
  11. order_insertion_by = ['name']
  12.  
  13. class Meta:
  14. verbose_name = 'Category'
  15. verbose_name_plural = 'Categories'

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

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

  1. {% for category in category_list %}
  2. {% if category.base == True %}
  3. <li class="side-nav-title side-nav-item"> {{ category.name }}</li>
  4. {% if category.category_children.count != 0 %}
  5. {% for catego in category.category_children.all %}
  6. <li class="side-nav-item">
  7. {% if catego.category_children.count != 0 %}
  8. <a data-bs-toggle="collapse" href="#{{ catego.name }}" aria-expanded="false" aria-controls="sidebarTasks" class="side-nav-link">
  9. <i class="uil-clipboard-alt"></i>
  10. <span> {{ catego.name }} </span>
  11. <span class="menu-arrow"></span>
  12. </a>
  13. <div class="collapse" id="{{ catego.name }}">
  14. <ul class="side-nav-second-level">
  15. {% for item in catego.category_children.all %}
  16. <li>
  17. <a href="apps-tasks.html">{{ item.name }}</a>
  18. </li>
  19. {% endfor %}
  20. </ul>
  21. </div>
  22. </li>
  23. {% else %}
  24. <a href="#" class="side-nav-link"><i class="uil-clipboard-alt"></i>
  25. <span> {{ catego.name }} </span></a>
  26. </li>
  27. {% endif %}
  28. {% endfor %}
  29. {% endif %}
  30. {% endif %}
  31. {% endfor %}

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

3

Do you like it? Share on social networks!

1
NSProject
  • Sept. 7, 2022, 11:10 a.m.

И всё таки я решил эту проблему. Написав реальный такой костыль. Решив тем самым свою проблему.

    Comments

    Only authorized users can post comments.
    Please, Log in or Sign up
    • Last comments
    • Evgenii Legotckoi
      March 9, 2025, 9:02 p.m.
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      March 9, 2025, 4:14 p.m.
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      Nov. 22, 2024, 9:51 p.m.
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    • Evgenii Legotckoi
      Oct. 31, 2024, 11:37 p.m.
      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
    • A
      Oct. 19, 2024, 5:19 p.m.
      Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html