Javascript 数据库中base.html处的Django init内容

Javascript 数据库中base.html处的Django init内容,javascript,html,django,Javascript,Html,Django,我正在寻找比我的解决方案更好的解决方案。我有base.html,它代表我的布局,在布局的顶部是菜单。诀窍是根据数据库值“生成”某些菜单项。我有一个动态应用程序,用户可以登录,菜单项是'项目',我想只有特定用户的项目。另一个用户可以有不同的项目,因此会为他生成不同的菜单项。 我有一个想法,但我对此不太满意,它正在进行ajax调用并设置这个菜单元素的html。有一个问题是ajax调用会在每次请求后向服务器请求数据。你知道如何理智地解决我的问题吗?谢谢 我忘了指定我使用的是Django framewo

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

除非您有某种机制,否则每次请求时都必须进行数据库查询,以便为当前用户填充
项目
列表,无论您是否使用AJAX

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

context\u processors选项是一个可调用的列表,称为context processors,它将请求对象作为参数,并返回要合并到上下文中的项的字典

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

context\u processors.py

define projects(request):
    if request.user.is_anonymous():
        return {}
    else:
        return {'projects': request.user.project_set.all()}
并将其添加到设置.py中定义的列表中:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myproject.context_processors.projects',
)
在所谓的base.html模板中,只要当前用户登录,就会出现“projects”变量:

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

希望这有帮助。

很好,这似乎是理想的解决方案,但我只有一个问题。它如何确定是否需要在context_processors.py中调用该函数?例如,我没有登录,我正在浏览页面,然后我登录,它会调用该函数,或者它会在每个请求中调用该函数?在
TEMPLATE\u CONTEXT\u PROCESSORS
列表中添加的任何函数都会在每个请求中调用。