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

Posted

技术标签:

【中文标题】如何编辑 django-allauth 默认模板?【英文标题】:How to edit django-allauth default templates? 【发布时间】:2016-12-24 21:06:02 【问题描述】:

我正在使用 Django 1.10,我想将用于登录、登录等的 allauth 应用程序添加到我的网站。我已经从 pip 安装了 allauth,并尝试将 allauth 存储库中的模板放入我的模板文件夹中并调用它们,但我不知道如何使其工作。

【问题讨论】:

How to override template in django-allauth?的可能重复 查看这个详细且易于理解的答案 ***.com/a/62773971/8260949 【参考方案1】:

正确答案可以在这里找到:https://***.com/a/31282443/4992248

    创建yourproject/templates/allauth/account/ 并将您需要从/myproject/Lib/site-packages/allauth/templates/account 编辑的所有模板粘贴到此处。

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

    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',
            ],
        ,
    ,
]
    您永远不应该在 /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 第一种方式绝对不好 - 在更新 allauth 期间您将丢失所有更改。关于第二种方式-要么您使用非标准路径,要么djangoallauth的结构已更改(django我很少使用,allauth我上次使用一年前)。 @TitakFighter,正如您所说,问题可能是由于一年中不同版本的变化。经历了这里给出的其他几个解决方案以及关于 SO 的其他类似问题。大多数人似乎都尝试过解决方案,但未能成功解决并最终做复杂的事情。然而,该解决方案只是对上述解决方案的一个小调整。这就是评论的原因。谢谢 当您将新模板放在template\allauth\account 文件夹下时,为什么要将allauth 添加到您的'DIRS' 中? os.path.join(BASE_DIR, 'templates') 不会包含所有子文件夹吗?见***.com/a/9571112/895810 @dangel 很久以前了。我记得由于某种原因它在我的情况下不起作用。不幸的是,我不记得这个原因了。【参考方案2】:

模块的文档似乎已经过时了。对于 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 的新应用程序,然后我具有以下结构,并将其添加到 INSTALLED_APPS 之前的 'allauth' 声明:

irj_app / _shared

我在“_shared”文件夹中创建了一个模板目录,并添加了一个名为“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 / ... (template for other modules)

希望对你有帮助

【讨论】:

请注意,当我不小心有以下目录结构(而不​​是上面的)irj_app/_shared/templates/allauth/base.html(nb'allauth'目录)时,我无法让上面的工作【参考方案3】:

试试这个:

在应用的模板目录中创建 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',
        ],
    ,
,
]

【讨论】:

【参考方案4】:

这对我使用 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')],

【讨论】:

【参考方案5】:

我使用 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 doc templates

【讨论】:

必须是 account 而不是 accounts【参考方案6】:

Allauth 模板可以像普通模板覆盖方法一样被覆盖。

    设置模板目录

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

    您的模板目录将位于项目目录中。进入你的模板目录和create a directory named allauth, inside allauth create a template directory and inside that create a directory accounts

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

【讨论】:

它返回我说 TEMPLATE_* 设置已从版本 1.8 弃用【参考方案7】:

在 django-allauth==0.36.0

假设您要自定义登录页面。 不需要更改模板设置 只需在您的项目模板文件夹中创建一个名为 account 的文件夹: 克隆项目 git clone https://github.com/pennersr/django-allauth cd django-allauth/allauth/templates/account 将base.html和login.html复制到创建的账号文件夹中 我试过了,效果很好。

Official Link

【讨论】:

【参考方案8】:

好吧,我只是能够做到。

我不知道这些模板在哪里,但我发现,就我而言(我使用的是虚拟环境):

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

我修改了 base.html 并将我的静态文件夹与我所有的引导程序和 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"),
]

仅此而已。

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

【讨论】:

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

以上是关于如何编辑 django-allauth 默认模板?的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 django-allauth 的默认模板

无法覆盖 django-allauth 模板

站点包中缺少 Django-allauth 模板

如何使用 django-allauth 进行自定义注册?

自定义 django-allauth 登录视图

django-allauth 检索头像头像