0

我在 Django 项目中有 2 个应用程序,一个是 Saas,第二个是菜单。从 Saas 我可以将所有内容都保存到模板中,但从菜单中我无法在 html 导航栏中获取菜单项。我的项目树是

树的图片

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 %}

视图代码.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)
4

2 回答 2

0

您可以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_relatedQuerySet. 您还应该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}) 
于 2020-02-27T13:09:52.107 回答
0

您是Menu_list使用Menu.objects.all(). 并且在menu模型中没有任何类型的title字段要在模板中用作item.title. 所以,它不会给你任何东西,因为列表中没有任何类型的 pf 'title' 字段Menu

于 2020-02-27T13:10:15.230 回答