当我有全套的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
,则会显示这些类别,但不会在其他任何页面中显示。因此,它并没有在我的网站的每个页面中全局显示。
有什么建议吗?
答案 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 %}