16

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

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

示例应用程序设置中,我可以看到 django-allauth 应该期望它的模板位于account,openidsocialaccount目录中。但是当我将模板放在TEMPLATE_DIR/account/signup.html它没有被加载时,signup视图会显示与 django-allauth 捆绑在一起的模板。我想念什么?

4

9 回答 9

20

我最终求助于在 django-allauth 之前加载我的应用程序。在settings.py

INSTALLED_APPS = (
    ...
    'myapp',
    'allauth',
    'allauth.account'
)

该解决方案与示例应用程序中提供的内容背道而驰,但我无法以其他方式解决它。

于 2013-09-15T11:08:28.613 回答
7

直到今天——我们现在在 Django-1.10.5 上—— django-allauth 文档在这方面仍然没有帮助。似乎 Django 在列出的第一个应用程序的模板目录中查找,尽管有DIRSin的设置。我提供的答案只是为了帮助您实施 Adam Starrh 的答案,以帮助处理反向 url(在我处理这些错误之前我遇到了错误)。TEMPLATESsettings.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,因为我正在examplegit clone git://github.com/pennersr/django-allauth.git.

DIRS我将整个子目录accountsocialaccount提供的示例bootstrap模板复制到该目录中。这与它的目录结构完全相反,example因为它来自和文件中的github注释。settings.pyexample

你离开urls.py就像在example应用程序中一样,只需:

    url(r'^accounts/', include('allauth.urls')),  
于 2017-02-05T13:20:03.577 回答
6

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'),
]
于 2015-07-08T02:18:59.660 回答
3

在您看来:

from allauth.account.views import SignupView, LoginView


class MySignupView(SignupView):
    template_name = 'my_signup.html'


class MyLoginView(LoginView):
    template_name = 'my_login.html'
于 2016-04-06T15:04:36.067 回答
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 应用程序的模板文件夹中复制了完整的文件夹层次结构。

TEMPLATE_DIRS = [
    os.path.join(BASE_DIR, 'cms', 'templates', 'allauth'),
]

在这个例子中,我的应用程序的路径被命名为 cms,因为这是我的项目的主应用程序,您可以开始编辑 base.html 模板

于 2015-02-08T19:31:45.370 回答
2

根据此处提供的文档,可以通过复制项目模板基位置内的目录结构来覆盖模板。例如,仅通过创建account/logout.html,我就能够覆盖logout.htmlallauth. 在settings.py我的情况下说明here

TEMPLATES = [
   {
       'BACKEND': 'django.template.backends.django.DjangoTemplates',
       'DIRS': [os.path.join(BASE_DIR, 'templates')],
   }
]
于 2020-03-04T01:31:00.337 回答
1

我找到了一个更好的方法来做到这一点,但忘记了。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
    ...
]

还有一个设置可用于指向自定义页面,将在某个时候对其进行编辑。欢迎反馈。

于 2017-03-12T20:49:34.353 回答
1

一旦您知道 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 目录)。然后查看该错误,您可能会弄清楚您的配置有什么问题。

于 2020-07-07T11:11:56.660 回答
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上发帖,我发现这个解决方案很长时间了,最​​后它的工作,所以我分享它,希望可以帮助别人。

于 2020-05-20T14:13:29.007 回答