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