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

如何在Django中覆盖外部应用程序模板?,django,django-templates,django-recaptcha,Django,Django Templates,Django Recaptcha,我试图重写一个django-recaptcha模板,但没有成功。我做错了什么? 我知道,但它已经过时了。谢谢 django-recaptcha文件结构 Lib/ --site-packages/ ----captcha/ ------templates/ --------captcha/ ----------includes/ ------------js_v2_checkbox.html project/ ----templates/ --------captcha/ ----------

我试图重写一个
django-recaptcha
模板,但没有成功。我做错了什么? 我知道,但它已经过时了。谢谢

django-recaptcha文件结构

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

project/
----templates/
--------captcha/
------------includes/
----------------js_v2_checkbox.html
我的项目文件结构

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',
            ],
        },
    },
]

我可以看看你安装的应用程序的顺序吗?可能是您在呈现自己的模板之前呈现了
django-recaptcha-captcha
模板。要解决此问题,您可以在
已安装的应用程序列表中将外部应用程序
验证码移动到最后一个。

您有两个选项:

(1) 在您的设置中,按如下方式重新排列已安装的应用程序:

INSTALLED_APPS = [
    ...
    'project',
    ...
    'captcha',
    ...
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]
由于模板加载器将按照已安装的应用程序指定的顺序查找应用程序的模板目录,因此将首先找到您的模板

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

INSTALLED_APPS = [
    ...
    'project',
    ...
    'captcha',
    ...
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]
由于在APP_DIRS之前搜索DIRS,所以将首先找到您的模板

参考资料:

另一种可能的解决办法 我现在注意到
captcha/includes/js\u v2\u checkbox.html
包含在
captcha/widget\u v2\u checkbox.html

我不确定从验证码模块加载
widget\u v2\u checkbox.html
时到底会发生什么。。。因此,我会将“include”
widget\u v2\u checkbox.html
复制到项目的templates文件夹中

为了保持一致性,您可能还决定将完整的“模板/验证码”文件夹内容复制到项目中


升级验证码模块时,只需关注这些模板将来可能发生的更改。

在我的项目中没有名为
captcha
的应用程序。django recapcha位于settings.py中,名为
captcha
:您能否将
captcha
作为
已安装应用程序列表中的最后一个应用程序?您的
后端中是否有此应用程序<代码>'BACKEND':'django.template.backends.django.DjangoTemplates',
是的,我已经用完整的
模板更新了我的问题,这可能是因为我同时使用项目根目录中的模板文件夹和应用程序模板文件夹来覆盖模板吗?为了缩小范围,我建议设置模板[{…DIRS':[],“应用程序目录”:True,…然后重试解决方案(1).python manage.py check
是否有任何错误?是否有效?请告诉我,我会建议以后进行更多测试
check
之后没有错误,但我的Django似乎一点也不在乎…我会在模板文件夹导航中检查Django的顺序。一种方法是:将“js_v2_checkbox.html”重命名为验证码和项目模块中的“js_v2_checkbox.html.bak”。您将收到一个运行时错误,并使用settings.DEBUG=True详细解释了发生的情况。我在我的原始建议中添加了一种替代方法。。看一看;)