根据其他问题的答案,这似乎非常简单:
但是,我完全无法让它工作。
从示例应用程序设置中,我可以看到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'
)
在模板目录中添加allauth的模板目录,就可以解决问题。在Django 1.8中,可以通过编辑模板目录设置TEMPLATES
来完成此操作。
TEMPLATES = [
...
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'templates', 'allauth'),
],
]
TEMPLATE_DIRS = [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'templates', 'allauth'),
]
rootDir/templates/allauth/templates
文件夹下。所以需要两个更改。
(1)- 将 APP_DIRS : True
添加到模板 TEMPLATE_DIRS
,(2)--将 account/
复制到 allauth
文件夹下或使用 os.path.join(BASE_DIR,'templates','allauth','templates')
。 - pravinsettings.py
中TEMPLATES
中的DIRS
设置如何。我提供答案只是为了帮助您实现Adam Starrh的答案,并帮助解决反向URL的问题(在我处理这些问题之前,我遇到了错误)。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文件位于此处,所以你可以将上面的内容扩展到其他模板中。
我必须补充说明,在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错误,比如对于dropbox_login
,你没有提供一个命名视图。
在阅读了Burhan Khalid在这个其他stackoverflow线程中的评论后,我最终发现以下内容可以正常工作:
'DIRS': [
os.path.join(PROJECT_ROOT, 'templates', 'example'),
]
git clone git://github.com/pennersr/django-allauth.git
的example
应用时,在开发服务器上这将产生 /home/mike/example/example/templates/example
。bootstrap
模板中的整个子目录account
和socialaccount
复制到DIRS
目录中。这与example
应用程序从github
获取的目录结构以及example
的settings.py
文件中的说明完全相反。example
应用程序一样保留urls.py
文件,只需简单地: url(r'^accounts/', include('allauth.urls')),
在您的观点中:
from allauth.account.views import SignupView, LoginView
class MySignupView(SignupView):
template_name = 'my_signup.html'
class MyLoginView(LoginView):
template_name = 'my_login.html'
TEMPLATE=[]
,就非常容易了。如果只是覆盖allauth的模板,那么无需对视图或Python代码进行更改。'Loader'
:提供使用模板加载器的选项,负责定位模板、加载它们并返回模板对象。一般实现不会太多地使用它。如果您没有配置模板加载器,则以下两个选项之一将决定视图使用哪个模板。'DIRS'
:在此处,您可以明确告诉Django按顺序从上到下搜索模板的位置。'APP_DIRS'
:如果将此字段设置为true,则Django会在您应用的目录中查找模板。要正确地使用此选项,您需要按照以下方式组织您的模板:root_dir
app1_dir
templates
your_template.html
app2_dir
templates
your_template.html
Python installed directory or virtual env --> *Lib --> site-packages --> allauth --> templates*
通常情况下,您希望覆盖所有allauth的模板,因为它们非常基础,您希望美化/修改它们所有,以下是使您能够覆盖它们所有的步骤,如果您不希望覆盖它们所有,请按照以下方式操作,但不要更改该模板的HTML,简单明了!
假设您的项目结构如下:
projectdir
app1_dir
app2_dir
projectname_dir
将模板目录从Python安装目录或虚拟环境--> 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是项目目录(根目录)
基本上,你可以将从allauth目录复制的模板目录保存在任何自己选择的项目目录中,但你必须确保在这里提供了正确的路径:
'DIRS': [os.path.join(BASE_DIR, 'allauth', 'templates')
'APP_DIRS': False
。这样,Django会显示一条调试信息,并且不再使用应用程序目录(即site-packages中的allauth目录)。通过查看该错误消息,您可以找出配置中的问题。对我来说只有一个解决方案:
首先将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'),
]
account/logout.html
,就可以覆盖allauth
提供的logout.html
文件。在我的情况下,settings.py
如此设置。TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, '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上发帖,我找了很久终于找到了这个解决方案,现在分享出来,希望能帮助到其他人。
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
...
]
还有一个设置可以用来指向自定义页面,稍后会进行编辑。欢迎反馈。