【问题标题】:Django init stuff at base.html from database数据库中 base.html 中的 Django 初始化内容
【发布时间】:2015-11-07 23:54:31
【问题描述】:

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

【问题讨论】:

    标签: javascript html django


    【解决方案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 模板中,只要当前用户登录,'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_CONTEXT_PROCESSORS 列表中添加的任何函数都会在每个请求中调用。
    猜你喜欢
    • 2015-12-17
    • 2013-08-05
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多