在第三方Django应用程序中自定义模板

时间:2016-07-13 01:27:58

标签: python django

我在我的Django项目中使用第三方应用程序(django-social-share),但我需要自定义模板。我不知道该怎么做 - 我尝试的一切都使用默认模板。

当前的默认模板存储在:

django-social-share/django_social_share/templates/django_social_share/templatetags/post_to_facebook.html. 

我已经定制了一个:

{{project_root}}/{{app_name}}/templates/django_social_share/templatetags/post_to_facebook.html

我的模板设置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
                'django.core.context_processors.request',
                'mainsite.context_processors.google_api'
            ],
            'loaders': (
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
                'django.template.loaders.eggs.Loader',
            ),
        },
    },
]

3 个答案:

答案 0 :(得分:5)

要更改模板,您不必分叉应用。只需确保您已正确设置模板加载器。通常你喜欢这样的东西:(documentation

'loaders': [
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
    'django.template.loaders.eggs.Loader',
],

这意味着(以你的情况为例django_social_share/templatetags/post_to_gplus.html) - 在寻找模板时,Django会尝试找到它:

  1. 在项目的模板目录/目录中,在DIRS中指定 因此,如果您在<project_root>/templates/django_social_share/templatetags/post_to_gplus.html中有一个文件,则需要使用此文件。

  2. 在您当地的&#39;应用templates目录,如果在INSTALLED_APPS中。所以你可以创建例如social_share_custom应用,将其添加到INSTALLED_APPS并在以下位置创建模板:
    <project_root>/social_share_custom/templates/django_social_share/templatetags/post_to_gplus.html
    这种方法的好处是您可以在其他项目中轻松地重复使用social_share_custom

  3. 通过pip(或其他方式)安装的应用的templates目录中的

答案 1 :(得分:3)

您可以将模板放在项目中的单独应用中。 Django按照INSTALLED_APPS中定义的顺序在您的应用中查找模板,并使用第一个匹配项:

  

INSTALLED_APPS的顺序非常重要!例如,如果你想要   要自定义Django管理员,您可以选择覆盖   标准admin / base_site.html模板,来自django.contrib.admin,   在myproject.polls中使用您自己的admin / base_site.html。那你必须   确保你的myproject.polls出现在django.contrib.admin之前   在INSTALLED_APPS中,否则将加载django.contrib.admin   首先,你的将被忽略。 (source

所以创建一个应用程序,例如social_share_templates,并将其放在INSTALLED_APPS 之前 django_social_share。然后将模板添加到此文件夹:

{{project_root}}/social_share_templates/templates/django_social_share/templatetags/post_to_facebook.html

您当前配置不起作用的原因是您的本地应用与site-packages中的应用具有相同的名称。如果您的本地应用程序是一个实际的python模块,您将无法在站点包中使用该应用程序。否则,Django只是在site-packages中的应用程序中查找模板。

答案 2 :(得分:0)

文档说明:

  

模板位于django_social_share / templatetags / post_to_twitter.html,   django_social_share / templatetags / post_to_facebook.html和   django_social_share / templatetags / post_to_gplus.html。你可以覆盖它们   适合你的里程。

所以你可以直接覆盖它们。

如果你想要一些棘手的&#34;覆盖django寻找模板的路径&#34;: 首先重命名或移动原始模板。 然后在调试模式下启动django浏览到 - 你应该获取路径的地方 - django试图在调试屏幕中找到模板的顺序。 然后尝试将模板放在原始模板之前。

或者如果您有经验: 实例化app-Class,覆盖template-files-location并使用新类。

或将原始路径或文件符号链接到新路径或文件。