在base.html中使用数据库对象

时间:2018-08-27 08:37:25

标签: python django

当我有全套的model + view + url + template时,一切正常, 但是我想尝试一个带有我的产品类别的顶级菜单,而没有特定的给定URL。我希望它位于父级为base.html的菜单子级模板(?)中。 (我希望它在我的网站中具有全球性)

这是我的代码:

models.py

class Category(models.Model):
    parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

    def parents(self):
        return self.parent

    def tree(self):
        return f"{self.parent} | {self.name}"

views.py

class CategoryView(ListView):
    model = Category
    template_name = 'category_list.html'
    queryset = model.objects.all()
    context_object_name = 'categories'

base.html

<body>
    <div class="container-fluid">
        {% include 'navbar.html' %}
        {% include 'category_list.html' %}
        {% block content_body %}{% endblock %}
        {% include 'footer.html' %}
    </div>
</body>

category_list.html

<div class="row">
    {% for cat in categories %}
        <div class="col-1">
            {{ cat.name }}
        </div>
    {% endfor %}
</div>

urls.py

urlpatterns = [
    path('category/', CategoryView.as_view(), name='category'),
]

如果我访问网址127.0.0.1/category,则会显示这些类别,但不会在其他任何页面中显示。因此,它并没有在我的网站的每个页面中全局显示。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使用上下文处理器来做到这一点。在您的应用目录中创建一个名为context_processors.py的文件。在此文件中,将类别定义如下:

def categories(request):
from yourapp.models import Category
categories = Category.objects.all()

return {
    'categories ': categories ,  # Add 'categories ' to the context
}

然后编辑您的settings.py:

TEMPLATES = [
{
    ...
    'OPTIONS': {
        'context_processors': [
            ...
            'yourapp.context_processors.categories',
        ]
    }
}

]

然后您可以像这样访问它:

{% for c in categories %}
 {{ c.attribute_you_want_to_show }}
{% endfor %}