在 Django 3.2 应用程序中使用 Python 3.9,尝试覆盖 allauth 模板。

4

我正在使用Django 3.2上的ALLAUTH。大多数我找到的解决方案都是针对Django 1的,所以我希望在这里找到更现代的内容。

我已经安装了该模块/应用,但我在尝试覆盖自己的模板时遇到了问题。

在settings.py中:

INSTALLED_APPS = [
    ...
    'Landing.apps.LandingConfig',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google'
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            BASE_DIR / 'templates'
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # Already defined Django-related contexts here

                # `allauth` needs this from django
                'django.template.context_processors.request',
            ],
        },
    },
]

AUTHENTICATION_BACKENDS = [
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
]

研究Urls #该项目

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('Landing.urls')),
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),
]

Landing/urls.py #应用级别的url

from django.contrib import admin
from django.urls import path, include

from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('login/', views.LoginView.as_view(), name='account_login'),
    path('signup/', views.SignupView.as_view(), name='account_signup')
]

Home.html

<...>
<body>
    <H1>This is the homepage</H1>
    <p><a href="{% url 'account_login' %}">login</a></p>
    <p><a href="{% url 'account_signup' %}">Create Account</a></p>

</body>
<...>

注意:account_loginaccount_signup都在落地URL和落地视图中。 落地视图
from django.shortcuts import render
from allauth.account.views import LoginView, SignupView


# Create your views here.
def home(request):
    return render(request, 'Landing/home.html')


class LandingLogin(LoginView):
    print('found Login View....')
    template_name = 'authentication/login.html'


class LandingSignup(SignupView):
    print('found Login View....')
    template_name = 'authentication/account_signup.html'

我的文档树

输入图片描述

我可以打开localhost:8000,当html页面出现时,会发生两件事:

  1. home.html中的链接仍然指向allauth链接
  2. Landing / Home指向自定义模板,但它仍然路由到allauth页面。

如何将视图、链接和路由设置为正确的页面?

谢谢!

2个回答

2
Landing/urls.py 文件中,loginsignup 仍然指向 allauth 视图 (allauth.account.views.LoginView, allauth.account.views.SignupView) 而不是被覆盖的视图。
你能尝试更改它们吗?从:
    path('login/', views.LoginView.as_view(), name='account_login'),
    path('signup/', views.SignupView.as_view(), name='account_signup')

to:

    path('login/', views.LandingLogin.as_view(), name='account_login'),
    path('signup/', views.LandingSignup.as_view(), name='account_signup')

1
如果您想覆盖allauth提供的HTML模板,则需要将模板文件保存在templates/account/目录中,而不是templates/authentication/。然后您就不需要使用template_name变量。还要确保HTML文件的名称与您想要覆盖的页面相对应。例如,如果您想要覆盖登录页面,则需要在templates/account/目录中保存您的模板,并将其命名为login.html。您可以查看allauth库中的视图以了解需要保留的名称。更多信息请参见文档
此外,如@bdbd所述的答案,您需要在urls.py文件中更改视图名称。

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