Django,排除vi中的上下文处理器

2024-05-20 19:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

有没有办法在视图中排除上下文处理器? 我试着加入一个变量“会话请求“在视图中,然后删除它并在上下文处理器中返回一个空字典。但这很糟糕,而且可能存在并发问题。 我也可以在上下文处理器中解析“request”中的url并返回一个空字典,但这听起来又像是一次黑客攻击。在

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


Tags: 用户视图数据库表单字典网站菜单ajax
3条回答

重新设计你的应用程序可能更容易一些,这样一些视图就可以进行此查询,而其他视图则不会。您可以通过编写一个“基于类的视图”来避免这导致大量的重复,方法是:编写一个“基于类的视图”来生成这个特定的数据库查询并将其添加到上下文中,然后在需要新视图进行额外查询时继承它。我主张使用这种方法,而不是全局上下文处理器。在

This example演示如何向默认模板上下文添加内容。在

您可以在django.template.context中子类RequestContext,并重新定义其__init__方法。然后您可以在这些特定的视图中使用这个修改过的RequestContextRequestContext__init__当前如下所示:

def __init__(self, request, dict=None, processors=None, current_app=None, use_l10n=None):
        Context.__init__(self, dict, current_app=current_app, use_l10n=use_l10n)
        if processors is None:
            processors = ()
        else:
            processors = tuple(processors)
        for processor in get_standard_processors() + processors:
            self.update(processor(request))

在这里,get_standard_processors()返回在您的设置中定义的上下文处理器。在调用上下文处理器(上面代码的最后一行)之前,您可以添加一个检查来确定哪些处理器需要使用,哪些处理器需要跳过。在

Django的对象是lazy对象。您不需要计算上下文处理器中的实际内容,而是提供一个具有关联函数的lazy对象;当某个对象实际尝试使用该对象时,例如在模板中,它就会调用该函数。This answer给出了同一问题的一个例子。在

如果多次使用该变量,请注意记住;有些选项将重新调用函数,而有些选项将保存结果。您可以查看the source来确定。我认为SimpleLazyObject(如上面的答案中所示)能满足您的需要,但我最近还没有充分使用它来确定。在

(按要求答复……)

相关问题 更多 >