Невозможно получить пункт меню в шаблон - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть 2 приложения в Django Проект - Saas, а второй - Menu. из Saas я могу получить все в шаблон, но из меню я не могу получить пункты меню в html navbar. Дерево моего проекта

Picture For Tree

Код в Html Шаблон

                {% for item in Menu_list %}
                <li class="nav-item dropdown dropdown__megamenu">
                    <a class="nav-link dropdown-opener" href="#">
                       {{ item.title }}
                    </a>

                    <div class="custom-dropdown-menu custom-megamenu">
                        <div class="content">
                            <ul class="megamenu">
                                <a href="#">menu</a>
                            </ul>
                        </div>
                    </div>
                </li>
                {% endfor %}

Код для Views.Py

    from django.shortcuts import render
    from .models import Menu,MenuItem
    def index(request):
        Menu_list = Menu.objects.all()
        MenuItem_list = MenuItem.objects.all()
        return render(request, 'header-footer.html',{'Menu_list' : Menu_list,
                                          'MenuItem_list': MenuItem_list,}
                                          ) 

это у моих моделей в панели администратора все работает нормально, и я не могу добавить пункт меню и подменю, просто не могу получить его из базы данных. или в django можно ли получить базу данных без представлений?

My models

from django.db import models


 class Menu(models.Model):
name = models.CharField(
    (u'Name'),
    max_length=100
    )

slug = models.SlugField(
    (u'Slug')
    )

base_url = models.CharField(
    (u'Base URL'),
    max_length=100,
    blank=True,
    null=True
    )

description = models.TextField(
    (u'Description'),
    blank=True,
    null=True
    )

class Meta:
    verbose_name = (u'menu')
    verbose_name_plural = (u'menus')

def __unicode__(self):
    return u"%s" % self.name

def __str__(self):
    return self.__unicode__()

def save(self, *args, **kwargs):
    """
    Re-order all items from 10 upwards, at intervals of 10.
    This makes it easy to insert new items in the middle of
    existing items without having to manually shuffle
    them all around.
    """
    super(Menu, self).save(*args, **kwargs)

    current = 10
    for item in MenuItem.objects.filter(menu=self).order_by('order'):
        item.order = current
        item.save()
        current += 10


class MenuItem(models.Model):
menu = models.ForeignKey(
    Menu,
    verbose_name=(u'Name'),
    on_delete=models.CASCADE,
    )

order = models.IntegerField(
    (u'Order'),
    default=500
    )

link_url = models.CharField(
    (u'Link URL'),
    max_length=100,
    help_text=(u'URL or URI to the content, eg /about/ or http://test.com/')
    )

title = models.CharField(
    (u'Title'),
    max_length=100
    )

login_required = models.BooleanField(
    (u'Login required'),
    blank=True,
    default=False,
    help_text=(u'Should this item only be shown to authenticated users?')
    )

anonymous_only = models.BooleanField(
    (u'Anonymous only'),
    blank=True,
    default=False,
    help_text=(u'Should this item only be shown to non-logged-in users?')
    )

class Meta:
    verbose_name = (u'menu item')
    verbose_name_plural = (u'menu items')

def __unicode__(self):
    return u"%s %s. %s" % (self.menu.slug, self.order, self.title)

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Вы получены Menu_list, используя Menu.objects.all(). А в модели menu нет поля типа title, которое вы хотите использовать в шаблоне как item.title. Таким образом, это ничего не даст, потому что в списке Menu нет никакого поля типа pf 'title'.

0 голосов
/ 27 февраля 2020

Вы можете перечислить все MenuItem, используя обратное соотношение :

{% for item in menu_list %}
    <li>
        <a href="#">
            {{ item.title }}
        </a>
        <ul>
            {% for subitem in item.menuitem_set.all %}
                <li>
                    <a href="">
                        {{ subitem.title }}
                    </a>
                </li>
            {% endfor %}
        </ul>
    </li>
{% endfor %}

Имейте в виду, что для каждого вашего меню будет введен новый запрос, поэтому вам следует используйте prefetch_related в вашем QuerySet. Вы также должны использовать related_name в своих моделях, чтобы сделать обратную связь более читабельной:

class MenuItem(models.Model):
    menu = models.ForeignKey(Menu, related_name="items", ...)
def index(request):
   menu_list = Menu.objects.prefetch_related("items").all()
   return render(request, 'header-footer.html',{'menu_list' : menu_list}) 
...