【问题标题】:Overriding the logout link in Django admin覆盖 Django admin 中的注销链接
【发布时间】:2017-11-27 00:42:39
【问题描述】:

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

【问题讨论】:

    标签: django


    【解决方案1】:

    覆盖 Django admin 主页的最佳方法是覆盖 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 %}
    

    【讨论】:

      【解决方案2】:

      你有两种方法可以做到这一点,

      1. 不好的方式:

        转到您的 python 包目录并在django/contrib/admin/templates/admin 中找到 django-admin 模板。在这里,您将找到带有注销链接的 base.html 文件(在我的第 44 行),并在所有项目中永久更改 django admin。

      2. 好方法:

        您可以覆盖特定的 django-admin 模板,方法是将它们放在层次结构中的模板目录中,例如 templates/admin/[app-name]/[template-name]。这将其仅限于应用程序,并且更好。了解更多关于同一 here 的信息。

      【讨论】:

        【解决方案3】:

        自 OP 以来,Django 经历了一些版本更改,但在本评论 (Django-3.2) 的当前版本中,您可以通过在 settings.py 文件中添加:LOGOUT_REDIRECT_URL = '/your_desired_url/' 来完成更改注销重定向在你的主项目中

        我对 Django 和 Python 还是很陌生,但它按预期通过了我的单元测试和功能

        【讨论】:

        • 我将它与重定向到我想要的 URL 的 RedirectView 一起使用
        • 另外,您可以将 reverse_lazy("any-url_name") 与 LOGOUT_REDIRECT_URL 一起使用。
        【解决方案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 路径,但您也可以直接引用预期的注销视图。我认为重定向方法更干燥。

        从那里,只需将 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-14
          • 2017-05-26
          • 2017-10-14
          • 2014-08-15
          • 2019-08-15
          • 2021-06-10
          • 2017-08-23
          • 2012-04-19
          相关资源
          最近更新 更多