如何在Django中覆盖外部应用程序模板



我尝试重写django-recaptcha模板,但没有成功。我做错了什么?我知道Django中覆盖外部应用程序的模板,但它已经过时了。谢谢

django repatcha文件结构

Lib/
--site-packages/
----captcha/
------templates/
--------captcha/
----------includes/
------------js_v2_checkbox.html

我的项目文件结构

project/
----templates/
--------captcha/
------------includes/
----------------js_v2_checkbox.html

设置.py

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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',
],
},
},
]

您有两个选项:

(1( 在您的设置中,按如下方式重新排列INSTALLED_APPS:

INSTALLED_APPS = [
...
'project',
...
'captcha',
...
]

由于模板加载程序将按照INSTALLED_APPS指定的顺序在应用程序的templates目录中查找,因此将首先找到您的模板。

(2( 在templates[0]['DIRS']中列出项目的模板文件夹,如下所示:

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

由于DIRS是在APP_DIRS之前搜索的,您的模板将首先被找到。

参考文献:

https://docs.djangoproject.com/en/3.0/howto/overriding-templates/

另一种可能的解决方案

我现在注意到captcha/includes/js_v2_checkbox.html已包含在captcha/widget_v2_checkbox.html中。

我不确定当widget_v2_checkbox.html从captcha模块加载时会发生什么。。。所以我会将"包含"widget_v2_checkbox.html复制到您项目的模板文件夹中。

为了保持一致性,您还可以决定将完整的"templates/captcha"文件夹内容复制到您的项目中。

在升级captcha模块时,只需关注这些模板未来可能发生的变化。

我能看看你们INSTALLED_APPS的订单吗?可能是在渲染自己的模板之前先渲染django-recaptcha captcha模板。要解决此问题,您可以将外部应用程序captcha移到INSTALLED_APPS列表的最后。

最新更新