1

将额外的特定于站点的模板目录添加到 Django 中的模板目录设置的正确方法是什么?

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            <PREPEND SITE-BASED TEMPLATE DIR IN HERE>
            str(APPS_DIR.path('templates')),
        ],
        'OPTIONS': {
            'debug': DEBUG,
            'loaders': [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            ],
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.template.context_processors.media',
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

我显然不能在那里使用 Site.objects.get_current() 。

我可以编写自己的模板加载器来使用它,但那是“正确的”吗?

或者我应该使用设置文件的扩展版本还是什么?

4

1 回答 1

0

首先,从分离设置开始。您应该有一个设置层次结构,如下所示:

base_settings.py
siteA_settings.py
siteB_settings.py

base_settings.py你应该把项目范围内的所有设置都放在上面 。siteA_settings.py(这是一个孩子)将覆盖base_settings.

要使其特定于站点,您必须在每个设置文件中添加SITE_ID设置。示例siteA_settings.py

# Sites Framework
SITE_ID = 1
SITE_TITLE = 'First Site'

然后加载TEMPLATES设置。它们在每个设置文件上可能不同。例子:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        os.path.join(BASE_DIR, 'templates'),
    ],
    'APP_DIRS': True,
 ... , etc. 

就像模板一样,您可以为每个站点选择不同的设置(应用程序、电子邮件设置等)

然后,当您运行服务器时,您应该指定要运行的设置(站点)。例子:

python manage.py runserver --settings=myproject.siteA_settings

myproject您的设置所在的应用程序在哪里。

不要忘记--settings每次运行命令时都必须输入参数(包括 makemigrations、migrate 等)


通常,在我的项目中,我会创建一个core应用程序、一个settings目录并在其中放置 base_settings.pydev.pylocal.pyproduction.py。运行 Django 开发服务器时,我会运行以下命令:

python manage.py runserver --settings=core.settings.local

于 2018-04-24T23:49:04.843 回答