其他问题的答案给人的印象是这实际上很容易:
但是,我根本无法让它工作。
从示例应用程序设置中,我可以看到 django-allauth 应该期望它的模板位于account
,openid
和socialaccount
目录中。但是当我将模板放在TEMPLATE_DIR/account/signup.html
它没有被加载时,signup
视图会显示与 django-allauth 捆绑在一起的模板。我想念什么?
其他问题的答案给人的印象是这实际上很容易:
但是,我根本无法让它工作。
从示例应用程序设置中,我可以看到 django-allauth 应该期望它的模板位于account
,openid
和socialaccount
目录中。但是当我将模板放在TEMPLATE_DIR/account/signup.html
它没有被加载时,signup
视图会显示与 django-allauth 捆绑在一起的模板。我想念什么?
我最终求助于在 django-allauth 之前加载我的应用程序。在settings.py
:
INSTALLED_APPS = (
...
'myapp',
'allauth',
'allauth.account'
)
该解决方案与示例应用程序中提供的内容背道而驰,但我无法以其他方式解决它。
直到今天——我们现在在 Django-1.10.5 上—— django-allauth 文档在这方面仍然没有帮助。似乎 Django 在列出的第一个应用程序的模板目录中查找,尽管有DIRS
in的设置。我提供的答案只是为了帮助您实施 Adam Starrh 的答案,以帮助处理反向 url(在我处理这些错误之前我遇到了错误)。TEMPLATES
settings.py
在您的 urls.py 文件中放置:
from allauth.account.views import SignupView, LoginView, PasswordResetView
class MySignupView(SignupView):
template_name = 'signup.html'
class MyLoginView(LoginView):
template_name = 'login.html'
class MyPasswordResetView(PasswordResetView):
template_name = 'password_reset.html'
urlpatterns = [
url(r'^accounts/login', MyLoginView.as_view(), name='account_login'),
url(r'^accounts/signup', MySignupView.as_view(), name='account_signup'),
url(r'^accounts/password_reset', MyPasswordResetView.as_view(), name='account_reset_password'),
]
目前 views.py 文件在这里,因此您可以将上述内容扩展到其他模板。
我必须补充一点,您仍然需要 in TEMPLATES
,例如:
'DIRS': [
os.path.join(PROJECT_ROOT, 'templates', 'bootstrap', 'allauth', 'account'),
],
在此示例中,如果您的模板位于 中/templates/bootstrap/allauth/account
,则在我的情况下。和:
PROJECT_ROOT = os.path.normpath(os.path.dirname(os.path.abspath(__file__)))
编辑...正确的方法:
好的,上面的工作,在一定程度上,它直接将模板设置为您想要的很好。但是,一旦您包含社交应用程序,您就会开始收到反向 url 错误,例如 for dropbox_login
,您还没有为其提供命名视图。
在阅读了 Burhan Khalid 对提问者发现的另一个 stackoverflow 线程的评论后,我最终发现以下工作:
'DIRS': [
os.path.join(PROJECT_ROOT, 'templates', 'example'),
]
在我的情况下,这会在开发服务器上产生/home/mike/example/example/templates/example
,因为我正在example
从git clone git://github.com/pennersr/django-allauth.git
.
DIRS
我将整个子目录account
和socialaccount
提供的示例bootstrap
模板复制到该目录中。这与它的目录结构完全相反,example
因为它来自和文件中的github
注释。settings.py
example
你离开urls.py
就像在example
应用程序中一样,只需:
url(r'^accounts/', include('allauth.urls')),
Adding a template directory for allauth in template dirs
会成功的。在 Django 1.8 中,他可以通过TEMPLATES
如下编辑模板目录设置来完成。
TEMPLATES = [
...
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'templates', 'allauth'),
],
]
我认为下面的代码将适用于其他版本的 django
TEMPLATE_DIRS = [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'templates', 'allauth'),
]
在您看来:
from allauth.account.views import SignupView, LoginView
class MySignupView(SignupView):
template_name = 'my_signup.html'
class MyLoginView(LoginView):
template_name = 'my_login.html'
对我来说,只有一种解决方案有效:
首先使 TEMPLATE_LOADERS 加载 filesystem.Loader
TEMPLATE_LOADERS = [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
]
第二 - 使用从 allauth 复制模板的路径创建 TEMPLATE_DIRS。确保您从 allauth 应用程序的模板文件夹中复制了完整的文件夹层次结构。
TEMPLATE_DIRS = [
os.path.join(BASE_DIR, 'cms', 'templates', 'allauth'),
]
在这个例子中,我的应用程序的路径被命名为 cms,因为这是我的项目的主应用程序,您可以开始编辑 base.html 模板
根据此处提供的文档,可以通过复制项目模板基位置内的目录结构来覆盖模板。例如,仅通过创建account/logout.html
,我就能够覆盖logout.html
由allauth
. 在settings.py
我的情况下说明here
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
}
]
我找到了一个更好的方法来做到这一点,但忘记了。All Auth 允许您非常容易地做到这一点,但文档很少。这是我的下一个最简单的解决方案,直到我重新发现更广泛的方法。#哈哈
该代码创建了一个自定义登录页面,但该模式简单且易于复制。您可以将所有这些代码放入urls.py
或不放入:
from allauth.account.views import LoginView
class Lvx(LoginView):
# Login View eXtended
# beware ordering and collisions on paths
template_name = "components/login.html"
# don't forget to create the login page, see All Auth docs
# for use. /components is in your app templates path
login = Lvx.as_view()
urlpatterns = [
url(r'^accounts/login/$', login), # usually up top
...
]
还有一个设置可用于指向自定义页面,将在某个时候对其进行编辑。欢迎反馈。
一旦您知道 Django 的模板查找顺序TEMPLATE =[]
并根据需要正确配置,这将非常容易。如果只是覆盖 allauth 的模板,则无需使用视图或 Python 代码。
我们先来了解一下Django的模板查找顺序,一点点。Django的模板查找顺序如下,所有这些都TEMPLATE =[]
在项目的settings.py里面配置。
I. 'Loader'
:让您可以选择使用负责定位模板、加载模板和返回模板对象的模板加载器。一般实现不会使用它。如果您尚未配置模板加载器,则以下两个选项之一将决定您的视图使用哪个模板。
二、'DIRS'
:在这里,您可以选择明确地告诉 Django 在哪里搜索模板,按顺序,从上到下。
三、'APP_DIRS'
:如果此字段设置为 true,则 Django 会在您的应用程序目录中查找您的模板。要正确使用此选项,您需要按如下方式组织模板:
root_dir
app1_dir
templates
your_template.html
app2_dir
templates
your_template.html
您必须将模板目录命名为“模板”,并且您必须将模板放在该目录中才能正常工作
第三个选项有点奇怪,如果在相应应用程序的模板目录中找不到您应用程序视图中的模板,Django 将通过其他应用程序的模板目录找到它。如果模板组织得当并且模板的命名约定是标准化的,那么它会很好地工作,这样当在本地应用程序的目录中找不到模板时,不应该在其他应用程序的目录中错误地找到该模板。好吧,您可能在某些情况下希望它以这种方式工作。
现在,直接回答您的问题: Allauth 默认使用以下模板:
Python installed directory or virtual env --> *Lib --> site-packages --> allauth --> templates*
您通常希望覆盖所有 allauth 的模板,因为它们非常基本,并且您希望全部美化/修改它们,如果您不想覆盖所有它们,以下是使您能够覆盖它们的步骤执行以下操作,但不要更改该模板的 HTML,简单!
假设你的项目结构如下:
projectdir
app1_dir
app2_dir
projectname_dir
将模板目录从复制Python installed directory or virtual env --> Lib --> site-packages --> allauth --> templates
到您选择的目录,假设您选择将其保存在 app1_dir 中(您可以选择任何目录,没有区别,但您应该根据您的要求选择合适的目录),然后在 app1_dir 中创建一个目录命名为“allauth”(您可以将其命名为任何您喜欢的名称),然后将复制的 allauth 模板目录粘贴到此目录中,所以现在您的项目结构如下所示:
projectdir
app1_dir
allauth
templates
account
openid
socialaccount
base.html
app2_dir
projectname_dir
更改您TEMPLATES = []
的项目设置,如下所示:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'allauth', 'templates'),
],
'APP_DIRS': True,
},
]
这里 BASE_DIR 是 projectdir (根目录)
基本上,您可以将复制的模板目录从 allauth 目录保留在您选择的任何项目目录中,但您必须确保您在此处提供了正确的路径:
'DIRS': [os.path.join(BASE_DIR, 'allauth', 'templates')
如果它不起作用,请设置'APP_DIRS': False
,然后您会看到来自 Django 的调试消息,并且它不会使用应用程序目录(站点包中的 allauth 目录)。然后查看该错误,您可能会弄清楚您的配置有什么问题。
在 django v2.0. 我使用这种方法及其作品。按照 django 书,[ https://djangobook.com/mdj2-django-templates/]。
重要的方法是使用[os.path.join(BASE_DIR, 'name_of_your_file/templates/allauth')]
而不是使用'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'allauth')],
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'name_of_your_file/templates/allauth')],
'APP_DIRS': True,
这是我第一次在stackoverflow上发帖,我发现这个解决方案很长时间了,最后它的工作,所以我分享它,希望可以帮助别人。