注销 django 用户身份验证重定向到 django 管理员注销页面

问题描述 投票:0回答:1

我正在学习使用 Django 的 LocalLibrary 教程创建一个简单的网站。我刚刚使用 Django 的身份验证系统创建了一个默认视图,用于在我的页面上登录和注销用户。但是,当我注销时,Django 不会重定向到我创建的模板来显示用户已注销。相反,它会重定向到 Django 管理员注销页面。还有一个问题是无法正确呈现登录以外的功能,包括密码重置表单和用于更改密码的 HTML。

这是我的基本 urls.py 文件。

from django.contrib import admin
from django.urls import path
from django.urls import include
from django.views.generic import RedirectView

urlpatterns += [
    path('catalog/', include('catalog.urls'))
urlpatterns += [
    path('', RedirectView.as_view(url='catalog/', permanent=True)),
]
# Add Django site authentication urls (for login, logout, password management)
urlpatterns += [
    path('accounts/', include('django.contrib.auth.urls')),    
]

这是我的 base.html 模板。

<!DOCTYPE html>
<html lang="en">
<head>
  {% block title %}<title>Local Library</title>{% endblock %}
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  <!-- Add additional CSS in static file -->
  {% load static %}
  <link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body>
  <div class="container-fluid">
    <div class="row">
      <div class="col-sm-2">
      {% block sidebar %}
        <ul class="sidebar-nav">
          <li><a href="{% url 'index' %}">Home</a></li>
          <li><a href="{% url 'books' %}">All books</a></li>
          <li><a href="{% url 'authors' %}">All authors</a></li>
        </ul>
      {% endblock %}
      </div>
      <div class="col-sm-10 ">
      {% block content %}{% endblock %}
      {% block pagination %}
       {% if is_paginated %}
        <div class="pagination">
            <span class="page-links">
                {% if page_obj.has_previous %}
                    <a href="{{ request.path }}?page={{ page_obj.previous_page_number }}">previous</a>
                {% endif %}
                <span class="page-current">
                    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
                </span>
                {% if page_obj.has_next %}
                    <a href="{{ request.path }}?page={{ page_obj.next_page_number }}">next</a>
                {% endif %}
            </span>
        </div>
       {% endif %}
      {% endblock %}        
      </div>
    </div>
  </div>
</body>
</html>

这是我的 logout.html 模板。

{% extends "base_generic.html" %}

{% block content %}
  <p>Logged out!</p>
  <a href="{% url 'login'%}">Click here to login again.</a>
{% endblock %}

这是我在 settings.py 中安装的应用程序

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'catalog.apps.CatalogConfig',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

这是我的 password_reset_form.html 模板。

{% extends "base_generic.html" %}

{% block content %}
  <form action="" method="post">
  {% csrf_token %}
  {% if form.email.errors %}
    {{ form.email.errors }}
  {% endif %}
      <p>{{ form.email }}</p>
    <input type="submit" class="btn btn-default btn-lg" value="Reset password">
  </form>
{% endblock %}

这是我的 password_reset_done.html 模板。

{% extends "base_generic.html" %}

{% block content %}
  <p>We've emailed you instructions for setting your password. If they haven't arrived in a few minutes, check your spam folder.</p>
{% endblock %}

当页面重定向到 Django Admin logout 时,url 显示为 http://127.0.0.1:8000/accounts/logout/ 这是我想要的 url,但这是我的管理员用户的注销页面,这意味着http://127.0.0.1:8000/admin/logout/http://127.0.0.1:8000/accounts/logout/ 实际上导致管理员用户的注销页面。 另外,还有一个问题就是只有login.html可以正确使用,而其他与认证相关的HTML文件,如logged_out.html、password_reset_form.html、password_reset_done.html、password_reset_email.html、password_reset_confirm.html、password_reset_complete.html等不能正确使用被使用。

使用的 Django 版本是 4.2.0 教程中使用的版本是 4.0

python html django django-urls
1个回答
0
投票

根据您提供的代码,您似乎没有为 Django 的身份验证视图指定正确的模板位置。要解决此问题,您需要通过在

registration
文件夹中创建一个
templates
文件夹并将身份验证模板放在那里来覆盖身份验证视图的默认模板。

以下是解决问题的步骤:

  1. 在项目的
    registration
    文件夹中创建一个
    templates
    文件夹。
  2. logout.html
    模板(以及您拥有的任何其他身份验证模板)移动到
    registration
    文件夹。
  3. logout.html
    重命名为
    logged_out.html
    因为 Django 在注销用户时默认查找
    logged_out.html
    模板。

现在,当您注销时,Django 应该重定向到您的自定义

logged_out.html
模板,而不是 Django 管理员注销页面。

关于其他认证模板的问题,确保它们也放在

registration
文件夹内的
templates
文件夹中。这应该可以解决呈现密码重置表单和其他相关模板的问题。

这里是模板名称及其对应视图的摘要:

  • login.html
    LoginView
  • logged_out.html
    LogoutView
  • password_reset_form.html
    PasswordResetView
  • password_reset_done.html
    PasswordResetDoneView
  • password_reset_email.html
    PasswordResetView
  • 的电子邮件模板
  • password_reset_confirm.html
    PasswordResetConfirmView
  • password_reset_complete.html
    PasswordResetCompleteView

确保您的

registration
文件夹中的
templates
文件夹中包含所有这些模板。

© www.soinside.com 2019 - 2024. All rights reserved.