Django 上下文处理器可全局用于所有应用程序中的模板

Django context processors available globally to templates in ALL apps

我是 Django/Python 的新手,我正在尝试找出在我的项目中拥有可用于项目中所有应用程序模板的全局常量的最佳方法。基本全局信息,例如公司名称、Phone 号码、url、社交链接等

经过大量搜索,我找到的最佳答案是创建自定义上下文处理器,但我理解它的方式需要我在 [=44= 中创建一个自定义 content_processors.py 文件]每个应用程序,并在主项目的settings.py中添加对每个应用程序的引用。这似乎违反了 DRY 的概念,我假设我一定遗漏了一些基本的东西。

这就是我现在所拥有的。我的项目名为 www,其中一个应用程序名为 home

www/settings.py我有一行如下:

COMPANY_NAME = ‘My Company Name’

我创建了这个文件home/context_processors.py,内容如下:

from django.conf import settings

def www(request):
    return {
        'company_name': settings.COMPANY_NAME
    }

在我的 www/settings.pyTEMPLATES/OPTIONS/content_processors 部分,我添加了:

’home.context_processors.www’

而我在 /home/templates 中的主页模板有

{{ company_name }}

这非常有效,但现在当我创建另一个名为 products 的应用程序时,似乎我需要添加另一个 products/context_processors.py 的文件,内容完全相同作为 home/context_processors.py,我需要在 ’products.context_processors.www’

的设置中添加另一行

当然,我可以做到这一点,但这似乎有点重复,特别是考虑到我将有 几十个 个应用程序用于此站点。我假设必须有一种方法可以使这些通用字符串(和其他设置)可用于全球所有应用程序中的所有模板。

希望有人指出我理解中的一个简单错误:-)

我终于能够在非官方 Django Discord 论坛中得到答案,所以我想我会 post 这里的解决方案以防其他人 运行 遇到同样的问题。

事实证明,只要在一个应用中设置 context_processors,它使用的任何内容都可以在全球范围内使用。所以根据我上面的例子:

(1) 在项目的 settings.py 中,我在 context_processors 部分添加:

'home.context_processors.site_settings'

(2) 我在 settings.py 末尾添加:

COMPANY_NAME = ‘My Company Name’

(3) 考虑到我在项目中的第一个应用程序名为 home,我在该应用程序的目录中添加了一个名为 contenxt_processors.py 的文件夹,并将以下内容添加到文件中:

from django.conf import settings

def site_settings(request):
    return {
        'company_name': settings.COMPANY_NAME,
    }

(4) 现在我可以在 all 模板中,在 all 我的应用程序中使用常量,而不必重复其他应用程序中的过程。看起来 counter-intuitive,但它就像一个魅力。因此,在我添加 {{ company_name }} 的任何模板中,它将显示 我的公司名称 ,正如我在 settings.py 文件中设置的那样。

(5) 现在如果我想添加其他常量,我只需将它们添加到 COMPANY_NAME = ‘My Company Name’ 下的 settings.py 文件中。例如,我现在可以添加

COMPANY_URL = 'www.mydomain.com'

然后我还将它添加到我的主应用程序文件夹中的 context_processors.py 文件中。这样它现在看起来像这样:

from django.conf import settings

def site_settings(request):
    return {
        'company_name': settings.COMPANY_NAME,
        'company_url': settings.COMPANY_URL,
    }

就是这样,现在我的所有模板中都可以使用 {{ company_name }}{{ company_url }}