我尝试重写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
列表的最后。