【问题标题】:Add current site's domain to template dirs将当前站点的域添加到模板目录
【发布时间】:2018-04-24 16:11:41
【问题描述】:

在 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()。

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

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

【问题讨论】:

    标签: django django-templates django-sites


    【解决方案1】:

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

    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 是您的设置所在的应用程序。

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


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

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

    【讨论】:

    • 这不是特定于站点的,是吗?
    • @bodger BASE_DIR 是 Django 项目的绝对路径,另一行将目录连接到您的 abs 路径。 Ps:“特定于站点”是什么意思?适用于不同环境的不同设置?
    • 通过站点特定,我的意思是它使用站点框架。我需要代码为每个站点使用不同的模板。
    • @bodger 我明白你的问题。现在看一看,因为我更新并更改了整个答案。它应该可以解决您的问题:)
    • 这更有意义。但是不应该有办法从站点的域中计算出 DIRS 值吗?这就是我在自定义模板加载器中所做的。我只是想知道是否有另一种方法,使用设置,不需要我重新定义整个 TEMPLATES 设置。
    猜你喜欢
    • 2011-11-24
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多