【问题标题】:Django-allauth loads wrong base.html templateDjango-allauth 加载错误的 base.html 模板
【发布时间】:2013-05-07 17:43:29
【问题描述】:
我已经尝试让 django-allauth 工作了几天,我终于发现了发生了什么。
该应用程序不会加载与 django-allauth 一起安装的 base.html 模板,而是加载我用于网站其余部分的 base.html 文件。
我如何告诉 django-allauth 使用 virtualenv/lib/python2.7/sitepackages/django-allauth 目录中的 base.html 模板而不是我的 project/template 目录?
【问题讨论】:
标签:
python
django
django-allauth
【解决方案1】:
我遇到了相反的问题:我试图使用自己的 base.html 文件,但我的 Django 项目正在获取 django-allauth 版本的 base.html。事实证明,您在settings.py 中定义INSTALLED_APPS 的顺序会影响模板的呈现方式。为了让 my base.html 渲染而不是 django-allauth 中定义的渲染,我需要将 INSTALLED_APPS 定义如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# custom
'common',
'users',
'app',
# allauth
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
【解决方案2】:
除非直接调用,否则您的 base.html 是您定义的模板的扩展。
例如,如果您渲染一个名为 Page.html 的模板 - 在顶部您将拥有 {% extends "base.html" %}。
如上定义时,base.html 位于您在 settings.py 下的 TEMPLATE_DIRS = () 下定义的路径中 - 根据您的描述,该路径定义为 project/template。
最好的办法是将 django-allauth base.html 文件复制到定义的 TEMPLATE_DIRS 位置,将其重命名为 allauthbase.html,然后通过 {% extends "allauthbase.html" %} 扩展模板以包含它而不是默认库。
或者,您可以将子文件夹添加到您的模板位置,例如 project/template/allauth,将 allauth base.html 放在那里,然后使用 {% extends "allauth/base.html" %}。
【解决方案3】:
两年后,这仍然是一个问题,并且公认的答案缺少一些新信息。
在github 上,我发现所有allauth 模板都派生自account/base.html,而account/base.html 派生自base.html。我的解决方案是:
- 在
virtualenv/lib/python2.7/sitepackages/django-allauth/templates 中,复制base.html 的全部内容以替换account/base.html 中的所有内容(即替换{% extends 'base.html' %} 语句)
- 删除allauth的
base.html。它现在是多余的。
完成!
【解决方案4】:
提供的所有答案都迫使您重写文件并修改自己的项目以适应 allauth,这是一个完全不可接受的工作流程。这样的第三方应用程序不应该对您自己的项目具有这种操纵能力。
确实,处理这种情况的最简单方法(尤其是根据所提供的答案)是简单地将 allauth 应用程序及其相关应用程序移动到 INSTALLED_APPS 文件中 INSTALLED_APPS 列表的末尾。 Django 会先找到你的 base.html 模板,然后再在它下面列出的其他应用程序中找到另一个 base.html 模板。
问题解决了。
【解决方案5】:
django-allauth 模板似乎扩展了 account/base.html (example),后者扩展了 base.html。
因此,将base.html 复制到例如myapp/templates/account/base.html,并确保myapp 在django-allauth 之前加载(通过将INSTALLED_APPS 放在更高的位置)。
现在 django 身份验证模板将扩展您的 account/base.html,这将是 django-allauth 的 base.html。
这并不完美,因为django-allauth 的base.html 可能会更新,您会错过这些更新。但这似乎比重命名所有导入或更改 django-allauth 代码要好。
请注意,您也可以在内容周围的base.html 中添加{% block content %},然后django-allauth 将使用该样式,这在许多情况下似乎是一件好事。
【解决方案6】:
Allauth 尝试扩展 myproject/templates/base.html。最简单的方法是将base.html 移动到myproject/templates/site/ 以获得myproject/templates/site/base.html 或简单地重命名base.html