【问题标题】:Pointing Django to Different Template Directory将 Django 指向不同的模板目录
【发布时间】:2018-01-01 04:46:51
【问题描述】:

我目前正在构建一个基于 Django-Oscar 的 Django 电子商务网站。默认情况下,后者带有基本的 Bootstrap 主题和样式。

我把这些模板文件移到了

project_root/templates/oscar

据我了解,如果我要覆盖这些模板,它将覆盖位于 virtualenv 中的原始 Oscar 模板。

下一步是我下载了一个我想用于网站的不同主题。

特别是,我希望该主题存在于

project_root/templates/main_theme

问题是我似乎无法让 Django 从该目录中提取模板。如果我删除 project_root/templates/oscar,它似乎会重新使用默认的 Oscar 模板。

如果我将base.html 放入project_root/templates/ 并使其base.html 成为新主题的主文件,则会显示它。但是,我仍然想把它分解成更小的文件,让它们“活”在一个单独的目录中。我怎样才能做到这一点?有没有更谨慎的方法来解决这个问题?

以下是一些相关设置:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.flatpages',
    'django.contrib.sites',

    'compressor',
    'widget_tweaks',
] + get_core_apps()

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
            OSCAR_MAIN_TEMPLATE_DIR,
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',

                'oscar.apps.search.context_processors.search_form',
                'oscar.apps.promotions.context_processors.promotions',
                'oscar.apps.checkout.context_processors.checkout',
                'oscar.apps.customer.notifications.context_processors.notifications',
                'oscar.core.context_processors.metadata',
            ],
        },
    },
]

COMPRESS_ROOT = os.path.join(BASE_DIR, "static")

STATIC_URL = '/static/'

#STATIC_ROOT = os.path.join(BASE_DIR, "static")

#This should be commented out in Development
STATICFILES_DIRS = [
  os.path.join(BASE_DIR, "static"),
]

MEDIA_URL = "/media/"

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

【问题讨论】:

  • 你为什么不在模板内的 oscar 目录中进行更改?这就是您覆盖默认模板的方式
  • 问题是它似乎对此没有反应。它仍然采用原始的奥斯卡模板。我尝试在templates/oscar 中创建一个基本的base.html,但仍然获得了默认样式。答案的另一部分是我这样做是出于组织原因。
  • 在templates/oscar/templates中你会找到一个base.html,尝试删除该页面的所有内容并检查它是否被渲染
  • 我没有templates/oscar/templates。我有templates/oscar
  • os.path.join(BASE_DIR, 'templates') 更改为os.path.join(BASE_DIR, 'templates/oscar') 会改变事情吗? OSCAR_MAIN_TEMPLATE_DIR 包含 oscar 子目录,因此您可能也必须这样做。

标签: python django templates django-templates django-oscar


【解决方案1】:

以下代码对我有用。事实证明,需要在TEMPLATES 列表的DIR 列表中指定一个附加条目。

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

            #re-route the search for templates into this custom template directory
            os.path.join(os.path.join(BASE_DIR, 'templates'), 'tshirt-theme'),

            #Uncomment the line below to restore the original Oscar template
            #OSCAR_MAIN_TEMPLATE_DIR,
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',

                'oscar.apps.search.context_processors.search_form',
                'oscar.apps.promotions.context_processors.promotions',
                'oscar.apps.checkout.context_processors.checkout',
                'oscar.apps.customer.notifications.context_processors.notifications',
                'oscar.core.context_processors.metadata',
            ],
        },
    },
]

【讨论】:

    【解决方案2】:

    您还可以将不同的路径分配给目录作为变量:

    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates/local')
    OSCAR_TEMP_DIR = os.path.join(BASE_DIR, 'templates/oscar')
    TEMP_DIR = os.path.join(BASE_DIR, 'templates')
    

    然后在 settings.py 的 Templates 部分中,将这些变量分配给 Directory arg。

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [TEMPLATES_DIR, OSCAR_TEMP_DIR, TEMP_DIR],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
    
                    'oscar.apps.search.context_processors.search_form',
                    'oscar.apps.checkout.context_processors.checkout',
                    'oscar.apps.customer.notifications.context_processors.notifications',
                    'oscar.core.context_processors.metadata',
                ],
            },
        },
    ]
    

    现在,您可以放置​​和使用任一模板中的任何一个

    1. project_dir/templates/local
    2. project_dir/templates/oscar
    3. project_dir/templates/ 对于任何相交的模板文件 两者(例如:main base.html)。

    如果您必须使用多个模板目录,则代码更易于阅读和清洁。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 2015-04-21
      • 2019-04-29
      • 2012-07-18
      • 2015-06-25
      • 2021-09-09
      相关资源
      最近更新 更多