在Django管理界面中覆盖注销链接

4

有没有办法覆盖Django管理页面上的注销链接?我试图在用户注销时删除cookie。

4个回答

4

您还可以通过在urls.py中覆盖URL路径来完全避免修改模板代码。只需在管理员URL之前包含覆盖,例如:

# project/urls.py

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

# import logout view
from app.views import logout_view

urlpatterns = [
  ...
  path('logout/', logout_view, name='logout'),
  # note the override comes before the admin URLs below
  path('admin/logout/', lambda request: redirect('/logout/', permanent=False)),
  path('admin/', admin.site.urls)
  ...
]

这个示例使用重定向到预期的注销URL路径,但也可以直接引用预期的注销视图。我认为重定向方法更加DRY。
然后,在您的注销视图中放置Cookie删除逻辑即可。
# app/views.py

from django.shortcuts import redirect
from django.contrib.auth import logout

def logout_view(request):
  logout(request)
  response = redirect('/home')
  response.delete_cookie('example_cookie')
  return response

1
谢谢。我认为这就是楼主正在寻找的确切答案。 - chip

4

自从原帖发表以来,Django已经经历了几次版本更改,但在本评论发布时的最新版本(Django-3.2)中,您可以通过在主项目的settings.py文件中添加:LOGOUT_REDIRECT_URL = '/your_desired_url/' 来实现更改注销后的重定向地址。

我对Django和Python都比较陌生,但它通过了我的单元测试并且按预期运行。


我使用RedirectView将其与重定向到所需URL的视图一起使用。 - mrroot5
此外,您可以在 LOGOUT_REDIRECT_URL 中使用 reverse_lazy("任何 URL 名称")。 - Rodrigo Nogueira
LOGOUT_REDIRECT_URL告诉Django用户成功注销后要提供哪个URL。但我认为OP想知道如何更改注销功能本身的行为。 - Dr Phil

4
你有两种方法可以实现这个功能:
1. 不好的方法:进入你的Python包目录,找到django-admin模板在django/contrib/admin/templates/admin中。在这里,你会找到base.html文件和注销链接(在我的文件中是第44行),并永久更改所有项目中的Django管理页面。
2. 好的方法:你可以通过将特定的django-admin模板放在类似于templates/admin/[app-name]/[template-name]的层次结构中来覆盖它们。这将仅限于该应用程序,并且效果更好。在这里了解更多相关信息:here

4
覆盖Django admin首页的最佳方法是覆盖管理模板。创建自己的管理模板目录并在其中创建base.html文件。 我相信你正在尝试覆盖注销链接。您需要重新编写userlinks块。我不会讲解JavaScript部分,但您可以像下面这样编写您的base.html。
{% extends "admin/base.html" %}
{% load i18n %}

{% block extrahead %}
// write your js script here, may be on click of the logout link or whatever. 
{% endblock %}

{% block userlinks %}
                {% url 'django-admindocs-docroot' as docsroot %}
                {% if docsroot %}
                    <a href="{{ docsroot }}">{% trans 'Documentation' %}</a> /
                {% endif %}
                <a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> /
                <a href="{% url 'admin:logout' %}" id="yourlogoutid">{% trans 'Log out' %} </a>
 {% endblock %}

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