我希望将我的导航链接从标准导航菜单存储在我的数据库中。理想情况下,这将允许一些特定的(非技术)用户能够维护web应用程序上的链接。今天,我的导航菜单是一个"静态"页面,包含在我的base.html中,在所有页面上都是一样的。任何更改都需要我手动更新nav静态文件并重新部署。
我的挣扎(这可能是我有限的django经验)是如何能够生成数据并从base.html/nav include中渲染它,而不必在页面的每次渲染上生成菜单项(例如获取菜单列表并发送到所有渲染调用)。我有几十个页面,所以这真的不是一个手动的选项。
我搜索过这个,看起来我不是唯一一个,但最接近的解决方案是2006年的,我相信在过去的15年里,这个领域有一些可能的进步。
感谢任何能给我指出正确方向的信息。干杯!如果您的菜单只是一个列表项目,您可以创建一个数据库表,其中包含alt - link文本,地址,is_active和order它们应该对齐。你需要在每个视图中获取导航项,或者你可以创建一个基视图它重写了get_context_data方法。
你的代码应该是这样的:
models.py
class NavLinks(models.Model):
title = ...
address = ...
order = ...
is_active = ...
class Meta:
ordering = ["order"]
views.py
from django.views.generic.base import ContextMixin
class NavView(ContextMixin):
def get_context_data(self, *args,**kwargs):
context = super().get_context_data(*args, **kwargs)
context["nav_links"] = NavLinks.objects.filter(is_active=True)
return context
你可以在其他视图中继承这个视图,这样你就不必在每个视图中都写上下文部分了。
from django.views.generic import TemplateView
class IndexView(NavView, TemplateView):
template_name = "index.html"
# other methods and stuffs
def get_context_data(self, *args,**kwargs):
context = super().get_context_data(*args, **kwargs)
# this context has nav_links
# other context data
context["other"] = somedata
return context
现在唯一要做的就是在模板中显示数据所以我要创建一个nav。html文件然后在base。html
中扩展它nav.html
<nav>
<ul>
{% for nav_link in nav_links %}
<li><a href="{{nav_link.address}}">{{nav_link.title}}</a></li>
{% endfor %}
</ul>
</nav>
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% extends 'nav.html' %}
{% block content %}
{% endblock content %}
</body>
</html>
index . html
{% extends 'base.html' %}
{% block content %}
<!-- Other Main Content -->
{% endblock content %}
我认为这应该足够一个简单的一级菜单。