Django,在视图中排除上下文处理器

Ash*_*she 1 python django django-views

我有一个带有菜单的网站。为了生成菜单,我需要在数据库中进行一些查询。因此,我创建了一个上下文处理器来在我的所有视图中执行此操作。

我的一些观点实际上只是形式。当我的用户单击某些按钮时,我使用 ajax 获取它们并使用 jquery ui 对话框显示它们。

我无法删除那些相当复杂的表单的所有上下文处理器,我特别需要 auth、static 和 il8n 上下文处理器。但我不想在数据库中进行基于菜单的查询来显示这些表单。

有没有办法在视图中排除上下文处理器?我尝试将变量放入视图中的“request.session”中,然后将其删除并在上下文处理器中返回一个空字典。但这非常糟糕,并且可能存在并发问题。我还可以在上下文处理器中解析“请求”中的 url 并返回一个空字典,但这听起来又像是黑客攻击。

有什么想法或建议吗?谢谢,

Dou*_*gal 5

这就是 Django 惰性对象的用途。您不是在上下文处理器中计算实际内容,而是提供一个具有关联函数的惰性对象;当某些东西实际上尝试使用该对象(例如在模板中)时,它会调用该函数。这个答案给出了同一问题的例子。

如果多次使用该变量,请注意记忆;有些选项将重新调用该函数,而有些选项将保存结果。您可以查看来源来确定。我认为SimpleLazyObject(如上面的答案)做你想要的,但我最近没有使用它来确定。

(应要求答复......)

  • 我尝试使用一种执行 User.objects.get 的函数,然后将结果多次包含在模板中,但我只能通过调试工具栏看到一个数据库请求。我认为它的工作原理与您告诉我的默认选项完全相同。 (2认同)