如何编辑django-allauth默认模板?

24

我正在使用Django 1.10,并想在我的网站上添加allauth的应用程序以进行登录、注册等操作。我已经通过pip安装了allauth,并尝试将来自allauth存储库的模板放入我的templates文件夹中并调用它们,但我不知道如何使其工作。


可能是如何在django-allauth中覆盖模板?的重复问题。 - TitanFighter
请查看这个详细且易于理解的答案:stackoverflow.com/a/62773971/8260949 - Vivek Singh
1
请使用 https://github.com/danihodovic/django-allauth-ui。 - danihodovic
9个回答

42

正确的答案可以在这里找到:https://dev59.com/-GMk5IYBdhLWcg3w-Spm#31282443

  1. 创建yourproject/templates/allauth/account/目录,并将需要编辑的所有模板从/myproject/Lib/site-packages/allauth/templates/account复制到此处。

如果您需要更改socialaccount模板,请同时创建yourproject/templates/allauth/socialaccount/

  1. settings.py中编辑'DIRS',例如:'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, 'templates'), os.path.join(BASE_DIR, 'templates', 'allauth')],
        'APP_DIRS': True,
        'OPTIONS': {
            'debug': False,
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.template.context_processors.media',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
  1. 你绝不能在 /Lib/site-packages/* 目录下进行任何代码更改,因为一旦包更新,所有更改都会丢失。

这对我没有起作用。我需要做出的更改是将yourproject/templates/allauth/account/复制到/myproject/Lib/site-packages/allauth/account,或者将os.path.join(BASE_DIR,'templates','allauth')更改为os.path.join(BASE_DIR,'templates','allauth','templates')。希望这可以帮助到您。 - pravin
@pravin 第一种方法绝对不好 - 在更新“allauth”期间,您将失去所有更改。关于第二种方法 - 要么您使用的是非标准路径,要么“django”或“allauth”的结构已更改(我很少使用“django”,上次使用“allauth”是1年前)。 - TitanFighter
@TitakFighter,正如您所说,问题可能是由于不同版本的更改而引起的。我查看了这里提供的其他解决方案以及SO上类似问题的几个解决方案。大多数人似乎都尝试过这些解决方案,但并没有成功,最终只能做一些复杂的事情。然而,解决方案只需要对上面的解决方案进行微小的调整。这就是评论的原因。谢谢。 - pravin
当您将新模板放置在template\allauth\account文件夹下时,为什么要将allauth添加到您的'DIRS'中?如果使用os.path.join(BASE_DIR,'templates'),那不是已经包括所有子文件夹了吗?参见https://dev59.com/U2ox5IYBdhLWcg3wGwlo#9571112 - dangel
@dangel 那是很久以前的事了。我记得出了某些问题,它在我的情况下并没有起作用。不幸的是,我不记得是什么原因了。 - TitanFighter
这个答案比它所指向的链接中的答案更清晰。其他地方的答案忘记了提到第一步。 - manpikin

11

这在我使用Django 2.1.7和django-allauth 0.39.1时有效:

  • 在文件夹yourapp/templates/下创建一个名为account的文件夹,最终目录结构是yourapp/templates/account/,并添加你想要覆盖的所有模板,如login.htmlsignup.html

  • settings.py中,我的模板目录保持不变:

    'DIRS': [os.path.join(BASE_DIR, 'templates')],


7
尝试这个:
在您的应用程序的模板目录中创建“帐户”目录,使其如下所示:
yourppname/templates/account
并添加以下文件:
yourppname/templates/account/login.html yourppname/templates/account/signup.html
并将以下内容添加到您的TEMPLATE DIRS。 请记住将“yourappname”更改为您的应用程序的名称。
os.path.join(BASE_DIR,'yourappname','templates')
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'yourappname', 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]

7

看起来这个模块的文档已经过时了。对于Django 1.10,您应该执行以下操作:

  • 使用pip下载该模块
  • 将以下内容添加到INSTALLED_APPS(/settings.py文件中)

'django.contrib.sites', # first place
'allauth',  # after your modules declarations
'allauth.account',
'allauth.socialaccount',
  • 添加后端声明和allauth所需的其他内容
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
)
SITE_ID = 1
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = True
  • 似乎在django 1.10下不需要修改TEMPLATES部分(django-allauth == 0.28.0)。您可以使用“pip freeze”命令验证模块版本。

  • 创建一个人工模块来覆盖模板;例如,我的项目名为irj_app,我添加了一个名为_shared的新应用程序,然后我有以下结构,并将其添加到' allauth '声明之前的INSTALLED_APPS中:

irj_app / _shared

  • 我在“_shared”文件夹内创建了一个templates目录,并添加了一个名为“base.html”的文件,该文件覆盖了allauth模板。我发现django-allauth会创建一个模板来覆盖您之前制作的布局,因此您需要拦截django-allauth模板以更改此行为。您也可以覆盖此身份验证机制的任何模板。例如,我有:

irj_app / _shared / templates / base.html

irj_app / _shared / templates / account / base.html

irj_app / _shared / templates / account / signup.html

irj_app / _shared / templates / _shared / adminlte-template / ...(其他模块的模板)

希望这有所帮助


请注意,当我意外地拥有以下目录结构(而不是上面的结构)时,我无法使其工作:irj_app / _shared / templates / allauth / base.html(nb 'allauth'目录)。该目录结构中多了一个'allauth'目录。 - andyw

2

像许多人已经在这里说过的那样,我们所要做的就是将allauth模板文件夹中的account、openid和socialaccount文件夹复制到我们项目文件夹的模板文件夹中。

但是,在添加 'DIRS': [os.path.join(BASE_DIR, 'project_name','templates')] 到设置中时,需要注意的一点是,django中的BASE_DIR指向manage.py所在的目录。而正是在这个级别上,我们有我们的项目文件夹和项目中的模板文件夹。因此,我们需要使用os.path.join将'project_name'和'templates'添加到DIRS中。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Richard Kenneth Niescior
这个页面上已经有多个人给出了直接答案,我只是分享一个实现该解决方案的正确方法。 - Sangeeth Joseph

1
我可以帮您翻译成中文。这段内容涉及编程,讲述了如何在django 3.0.4中使用django-allauth 0.41.0。请按照以下要求进行翻译,不要删除或添加任何内容:

我使用django 3.0.4和django-allauth 0.41.0

在您的项目目录中添加文件夹templates。 在文件夹templates中添加另一个文件夹,名称为app_name。对于模板login.html,您需要创建一个名为accounts的文件夹。

因此,完整路径将是

 /project_name/templates/accounts/login.html

我的settings.py中的模板目录保持不变

'DIRS': [os.path.join(BASE_DIR, 'templates')]

Django-allauth文档模板


6
必须使用“account”,而不是“accounts”。 - Rahul

0
在django-allauth==0.36.0中,假设您想要自定义登录页面。无需更改TEMPLATES设置,只需在项目模板文件夹中创建一个名为account的文件夹,然后克隆项目:
``` git clone https://github.com/pennersr/django-allauth cd django-allauth/allauth/templates/account ```
将base.html和login.html复制到创建的account文件夹中即可。我尝试过,它可以正常工作。 官方链接

0

Allauth模板可以像普通的模板覆盖方法一样进行覆盖。

  1. 设置模板目录

TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), os.path.join(BASE_DIR,'templates'))

  1. 您的模板目录将在项目目录中。进入您的模板目录并创建一个名为allauth的目录,在allauth内创建一个模板目录,在其中创建一个名为accounts的目录

  2. 创建与allauth模板同名的html文件。有关模板名称的更多信息,请参阅allauth github repository


它告诉我TEMPLATE_*设置已从1.8版本中弃用。 - Sebastian Tare B.

-2

好的,我刚刚成功做到了。

我不知道这些模板在哪里,但我发现,在我的情况下(我正在使用虚拟环境):

Envs/myproject/Lib/site-packages/allauth/templates

我修改了base.html文件,并将我的静态文件夹与所有的Bootstrap和jQuery添加到文件设置中:

app_settings.py

并添加了这个。

...
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

就是这样了。

我不知道这是否是正确的方法,但如果有更好的答案,请发表。


1
不应修改 Lib/site-packages 目录中的模板:如果您升级了包,您的更改将被覆盖。这也会使跟踪您的更改或打包您的修改变得非常困难。正确的方法是将模板复制到 templates/allauth/,并将其添加到设置中的 TEMPLATESDIRS 选项中,如其他答案所指定的那样。 - MichielB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接