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

3
我尝试覆盖 django-recaptcha 模板,但没有成功。我做错了什么? 我知道在Django中覆盖外部应用程序的模板,但它已经过时了。谢谢! django-recaptcha文件结构
Lib/
--site-packages/
----captcha/
------templates/
--------captcha/
----------includes/
------------js_v2_checkbox.html

项目文件结构

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

settings.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',
            ],
        },
    },
]
2个回答

1
你有两个选择:
(1)在设置中,按照以下方式重新排列INSTALLED_APPS:
INSTALLED_APPS = [
    ...
    'project',
    ...
    'captcha',
    ...
]

由于模板加载器将按照INSTALLED_APPS指定的顺序查找应用程序的模板目录,因此您的模板将首先被找到。
或者
(2) 将项目的模板文件夹列在TEMPLATES [0] ['DIRS']中,如下所示:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

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

参考资料:

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

另一个可能的解决方案

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

我不确定当从验证码模块加载widget_v2_checkbox.html时会发生什么...所以我建议将“包含”widget_v2_checkbox.html也复制到您项目的模板文件夹中。

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

只需留意升级验证码模块时这些模板的可能未来更改即可。


这可能是因为我同时在项目根目录和应用程序的模板文件夹中使用了模板来覆盖。 - undefined
我会检查Django在模板文件夹导航中的顺序。一种方法是:在captcha和project模块中将"js_v2_checkbox.html"重命名为"js_v2_checkbox.html.bak"。这样做会导致运行时错误,并且如果设置了settings.DEBUG = True,会有一个详细的解释说明发生了什么。 - undefined
我对我的原始建议添加了一种替代方法..看看吧 ;) - undefined
我尝试使用一个templates文件夹创建一个新的应用程序。那个方法有效。我有一种感觉,设置APP_DIRS: True会排除项目根目录下的templates文件夹... - undefined
只要你在settings.INSTALLED_APPS中列出它,该项目就应被视为一个应用程序。这是一个有效的Python模块吗?你可以执行python manage.py shell,然后从那里导入项目吗?它能正常工作吗?不过,既然你已经通过一个独立的应用程序解决了问题,我猜你的问题已经解决了 ;) - undefined
显示剩余3条评论

0
可以看一下你的 INSTALLED_APPS 的顺序吗?可能是因为在渲染你自己的模板之前,你正在渲染 django-recaptcha captcha 模板。要解决这个问题,你可以将外部应用 captcha 放在 INSTALLED_APPS 列表的最后。

我的项目中没有叫做captcha的应用程序。在settings.py中有一个名为captcha的django-recaptcha:https://github.com/praekelt/django-recaptcha - undefined
你能把captcha放在INSTALLED_APPS列表的最后吗? - undefined
你的 BACKEND 里有这个吗?'BACKEND': 'django.template.backends.django.DjangoTemplates', - undefined
是的,我确实有那个。 - undefined
我已经更新了我的问题,包括完整的TEMPLATES - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接