其他问题的答案给人的印象是,事实上这很容易:
但是,我根本无法让它工作。
从example app settings我可以看到django-allauth应该期望它的模板位于account
,openid
和socialaccount
目录中。但是当我将模板放在TEMPLATE_DIR/account/signup.html
时它没有加载,signup
视图显示与django-allauth捆绑在一起的模板。我错过了什么?
答案 0 :(得分:14)
我最终在django-allauth之前加载了我的应用程序。在settings.py
:
INSTALLED_APPS = (
...
'myapp',
'allauth',
'allauth.account'
)
此解决方案与示例应用中的内容不符,但我无法以其他方式解决此问题。
答案 1 :(得分:9)
Adding a template directory for allauth in template dirs
会做到这一点。在Django 1.8中,可以通过编辑模板目录设置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'))
答案 2 :(得分:6)
直到今天---我们现在正在使用Django-1.10.5 --- django-allauth docs在这方面仍然是最无益的。似乎Django在列出的第一个应用程序的模板目录中查找,尽管DIRS
中的TEMPLATES
设置为settings.py
。我提供的答案只是为了帮助你实现Adam Starrh的答案,以帮助反向网址(在我处理这些问题之前我遇到了错误)。
在你的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文件为here,因此您可以将上述内容扩展到其他模板。
我必须在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__)))
编辑......正确的方式:
好的,上面的工作到了一定程度,它直接将模板设置为你想要的是好的。但是,只要您添加社交应用,您就会开始收到反向网址错误,例如dropbox_login
,但您没有提供命名视图。
在阅读了Burhan Khalid对提问者发现的this other stackoverflow thread的评论之后,我最终发现以下作品:
'DIRS': [
os.path.join(PROJECT_ROOT, 'templates', 'example'),
]
在我的情况下,这会在开发服务器上产生/home/mike/example/example/templates/example
,因为我正在运行来自example
的{{1}}应用。
在git clone git://github.com/pennersr/django-allauth.git
的dir中,我从提供的示例DIRS
模板中复制了整个子目录account
和socialaccount
。这完全违背bootstrap
的目录结构,因为它来自example
以及github
settings.py
文件中的注释。
您离开example
就像在urls.py
应用中一样,只需:
example
答案 3 :(得分:3)
在您的观点中:
from allauth.account.views import SignupView, LoginView
class MySignupView(SignupView):
template_name = 'my_signup.html'
class MyLoginView(LoginView):
template_name = 'my_login.html'
答案 4 :(得分:2)
对我来说,只有一种解决方案有效:
首先使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 app的模板文件夹中复制了完整的文件夹层次结构。
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'cms', 'templates', 'allauth'),
)
在此示例中为我的应用程序创建了一个名为cms的路径,因为这是我项目的主要应用程序 在您开始编辑base.html模板
之后答案 5 :(得分:1)
我找到了一个更好的方法,但忘记了。所有Auth都可以让您轻松完成这项工作,但文档也很少。这是我的下一个最简单的解决方案,直到我重新发现更广泛的方式。 #lol
代码创建自定义登录页面,但模式简单且易于复制。您可以将所有这些代码放在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
...
]
还有一个设置可用于指向自定义页面,在某些时候会对其进行编辑。欢迎反馈。
答案 6 :(得分:1)
在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上发帖,我发现这个解决方案已经很长时间了,最后是它的工作,所以我分享了它,希望能对别人有所帮助。
答案 7 :(得分:0)
根据here提供的文档,可以通过在项目的模板基本位置内复制目录结构来覆盖模板。例如,仅创建account/logout.html
即可覆盖logout.html
提供的allauth
文件。在我的情况下,settings.py
如下
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
}
]
答案 8 :(得分:0)
一旦您知道Django的模板查找顺序,并根据需要正确配置TEMPLATE =[]
,就非常容易。如果只是要覆盖allauth的模板,则无需使用视图或Python代码。
首先让我们了解Django模板的查找顺序。 Django的模板查找顺序如下,所有这些都在项目的 settings.py。
中的TEMPLATE =[]
内部进行配置。
I。 'Loader'
:为您提供使用模板加载器的选项,该模板加载器负责查找模板,加载模板并返回模板对象。一般的实现并不会使用太多。如果尚未配置模板加载器,则以下两个选项之一将决定视图使用哪个模板。
II。 'DIRS'
:在这里,您可以选择明确地告诉Django从哪里搜索模板的顺序。
III。 '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(根目录)
基本上,您可以将复制的模板dir从allauth dir保留在您选择的任何项目的dir中,但是您必须确保在此处提供了正确的路径:
'DIRS': [os.path.join(BASE_DIR, 'allauth', 'templates')
如果它不起作用,则设置'APP_DIRS': False
,然后您会看到来自Django的调试消息,并且它不会使用应用程序目录(站点软件包中的allauth目录)。然后查看该错误,您可能会发现配置出了什么问题。