我怎么能不使用Django的管理员登录视图?

Buf*_*fke 22 django django-admin django-authentication

我创建了自己的登录视图.但是,如果用户直接访问/ admin,则会将其带到管理员登录页面,并且不会使用我的自定义视图.如何将其重定向到用于/ admin的所有内容的登录视图?

Isa*_*aac 51

来自http://djangosnippets.org/snippets/2127/-使用管理员登录页面login_required.例如,在urls.py:

from django.contrib.auth.decorators import login_required
from django.contrib import admin
admin.autodiscover()
admin.site.login = login_required(admin.site.login)
Run Code Online (Sandbox Code Playgroud)

你可能已经有两条线,甚至可能是第一条线; 添加第四行将导致任何可能使用相应参数admin.site.login重定向到您LOGIN_URLnext函数.

  • 假设我已经以非员工用户身份登录.如果我然后转到`/ admin /`我仍然会获得默认登录表单,因为`login_required`不会触发. (13认同)

小智 8

我发现上面的答案不正确地尊重"下一个"查询参数.

解决此问题的简单方法是使用简单的重定向.在您网站的网址文件中,包含管理网址之前,请输入如下所示的行:

   url(r'^admin/login$', RedirectView.as_view(pattern_name='my_login_page', permanent=True, query_string=True))
Run Code Online (Sandbox Code Playgroud)

  • 更妙的是,`url(r'^ admin / login / $',RedirectView.as_view(url = settings.LOGIN_URL,永久性= True,query_string = True)),`。 (4认同)

Tat*_*shi 8

While @Isaac's solution should reject majority of malicious bots, it doesn't provide protection for professional penetrating. As a logged in user gets the following message when trying to login to admin:

Django重新登录提示

We should instead use the admin decorator to reject all non-privileged users:

from django.contrib.admin.views.decorators import staff_member_required
from django.contrib import admin
[ ... ]
admin.site.login = staff_member_required(admin.site.login, login_url=settings.LOGIN_URL)
Run Code Online (Sandbox Code Playgroud)

To the best of my knowledge, the decorator was added in 1.9.

  • 完全有可能(很可能)我在做一些愚蠢的事情,但是当我这样做时,我最终会出现一个重定向循环,其中 `/admin/login/` 重定向到 `/admin/login/?next=/admin/login /`,重定向到 `/admin/login?next=/admin/login/%3Fnext%3D/admin/login/` 等。 (2认同)
  • @Isaac 有必要在这里传递 `login_url`:`admin.site.login = staff_member_required(admin.site.login, login_url=settings.LOGIN_URL)` (2认同)

ePi*_*314 5

Holá
我找到了一个非常简单的解决方案。
只需告诉 django 管理员登录的 url 由您自己的登录视图处理

您只需要修改项目的 urls.py 文件(注意,不是应用程序)

  1. 在您的项目文件夹中找到文件 urls.py。
  2. 将此行添加到导入部分
    from your_app_name import views
  3. 找到这一行
    url(r'^admin/', include(admin.site.urls))
  4. 在该行上方添加以下内容
    url(r'^admin/login/', views.your_login_view),

这是一个例子

    from django.conf.urls import include, url
    from django.contrib import admin

    from your_app import views

    urlpatterns = [
        url(r'^your_app_start/', include('your_app.urls',namespace="your_app_name")),

        url(r'^admin/login/', views.your_app_login),
        url(r'^admin/', include(admin.site.urls)),
    ]
Run Code Online (Sandbox Code Playgroud)