Django从数据库初始化base.html

时间:2015-11-07 23:54:31

标签: javascript html django

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

1 个答案:

答案 0 :(得分:1)

除非您有某种caching机制,否则您将不得不进行数据库查询,以便在每次发出请求时为当前用户填充projects列表,无论您是否是否使用AJAX。

这里的问题应该是尽可能通用,这样每个模板都会有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()}

并将其添加到 settings.py 中定义的TEMPLATE_CONTEXT_PROCESSORS列表中:

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

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

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

希望这有帮助。