如何覆盖django-allauth中的模板?

时间:2013-09-13 16:33:56

标签: python django django-allauth

其他问题的答案给人的印象是,事实上这很容易:

但是,我根本无法让它工作。

example app settings我可以看到django-allauth应该期望它的模板位于accountopenidsocialaccount目录中。但是当我将模板放在TEMPLATE_DIR/account/signup.html时它没有加载,signup视图显示与django-allauth捆绑在一起的模板。我错过了什么?

9 个答案:

答案 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模板中复制了整个子目录accountsocialaccount。这完全违背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目录)。然后查看该错误,您可能会发现配置出了什么问题。