Django:将管理员注销重定向到allauth登录

5
我正在使用django-allauth登录页面将用户登录到我的管理面板。 这很好用,但是当他们从管理面板注销时,我希望他们直接返回到/accounts/login/页面(最好是/accounts/login/?next=/admin/surveys/survey/),而不是到/admin/logout/页面上显示“感谢您花费宝贵时间与本站一起度过”。 我尝试在设置文件中使用LOGOUT_URL属性,但它似乎不能实现我上述描述的功能。以下是我相关代码的一部分:
# urls.py

from django.conf.urls import patterns, include, url
from django.views.generic import TemplateView

from mysite import views

from django.contrib import admin
admin.autodiscover()

from django.contrib.auth.decorators import login_required
admin.site.login = login_required(admin.site.login)

from django.contrib.auth import views as auth_views

urlpatterns = patterns('',
    url(r'^$', TemplateView.as_view(template_name='landingpage.html'), name='landingpage'),
    url(r'^surveys/', include('surveys.urls', namespace="surveys")),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^submitfeedback/$', views.submitfeedback, name='submitfeedback'),

    # tried this but it didn't work: url(r'^logout/$', 'django.contrib.auth.views.logout', {'next_page': '/accounts/login/'}),
    # tried this but it didn't work: url(r'^admin/logout/$', 'django.contrib.auth.views.logout', {'next_page': '/accounts/login/'}),

    ## below for django-allauth
    url(r'^accounts/', include('allauth.urls')),
)

# settings.py

LOGIN_REDIRECT_URL = "/admin/surveys/survey/"
LOGOUT_URL = "/accounts/login/"
3个回答

9
我认为最简单的方法不是在views.py中实现,而是在模板本身中实现。你需要的是复制admin/base.html文件(在Github上可以看到这里),将其放入项目的templates文件夹中,您可以根据需要进行覆盖。该模板包含了所有后续管理模板都会继承的头部信息。找到以下行:
<a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>

只需将其更改为:

<a href="{% url 'account_logout' %}">{% trans 'Log out' %}</a>

现在它应该遵循您网站上的所有身份验证注销格式。


谢谢!这几乎满足了我的需求——在实施您的建议后,它将我带到了这个令人讨厌的账户/注销页面,询问我是否真的想要注销。最终发现我可以将以下内容放入我的urls.py中,以便将我带到我实际想去的地方:url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'next_page': '/accounts/login/?next=/admin/surveys/survey/'}), - Gravity Grave

6
urls.py 中添加 url(r'^admin/logout/$', 'yourappname.views.signout'),并在包含 admin.site.urls 的代码前加入,如下所示:
urlpatterns = [
    url(r'^admin/logout/$', 'yourappname.views.signout'),
    url(r'^admin/', admin.site.urls),
    url(r'', include('appname.urls'))
]

当然,在您的应用程序中,您应该定义一个退出视图:
def signout(request):
    logout(request)
    return redirect(reverse('yourappname:index')) # or wherever you want

2
对于像我这样刚接触Django的新手来说,from django.contrib.auth import logoutfrom django.shortcuts import redirectfrom django.urls import reverse可能会很有用。 - Ian Williams

-1
这个问题老掉牙了(现在是2023年,Django 4.2.4),你可以通过在项目的url.py中添加来实现。
import allauth.account.views
...
urlpatterns = [
    path("admin/logout/", allauth.account.views.logout),
    ...
]

这将注销并将您发送回allauth的登录页面。 另外,可以将LOGIN_REDIRECT_URL设置为您想要的重定向地址(对于OP来说是/admin/surveys/survey/)。

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