Django从数据库初始化base.html中的东西

Django init stuff at base.html from database

本文关键字:html base 数据库 初始化 Django      更新时间:2023-09-26

我正在寻找比我的解决方案更好的解决方案。我有base.html,它代表我的布局,在布局的顶部是菜单。诀窍在于,某些菜单项是根据数据库值"生成"的。我有一个动态应用程序,用户可以登录,菜单项是"项目",我希望只有特定用户的项目。另一个用户可以有不同的项目,因此会为他生成不同的菜单项。我有一个想法,但我对此不是很满意,它正在对这个菜单元素进行ajax调用和设置html。有一个问题是ajax调用会在每次请求后向服务器请求数据。你知道如何明智地解决我的问题吗?谢谢我忘了说明我使用的是Django框架。

除非您有某种缓存机制,否则每次发出请求时,无论是否使用AJAX,都必须进行数据库查询,以填充当前用户的projects列表。

这里的问题应该尽可能通用,这样每个模板都会有projects数组,而不会更改后端的所有视图函数。就我个人而言,如果您要在每个模板中显示项目菜单,我建议您创建一个context processor

context_processors选项是一个可调用的列表,称为上下文处理程序,它们以请求对象为参数,并返回要合并到上下文中的项的字典。

在settings.py:旁边的项目根路径中创建一个名为context_processors.py的文件

context_processors.py

define projects(request):
    if request.user.is_anonymous():
        return {}
    else:
        return {'projects': request.user.project_set.all()}

并将其添加到设置中定义的TEMPLATE_CONTEXT_PROCESSORS列表中。py

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myproject.context_processors.projects',
)

在您所谓的base.html模板中,只要当前用户登录,"项目"变量就会出现:

base.html

{% block menu %}
  {% for project in projects %}
    Do whatever you want to do with {{project}}
  {% empty %}
    Either user is not logged in or they don't have a project.
  {% endfor %}
{% endblock %}

希望这能有所帮助。