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

我怎么能不使用Django';管理员登录视图?,django,django-admin,django-authentication,Django,Django Admin,Django Authentication,我创建了自己的登录视图。但是,如果用户直接转到/admin,则会将他们带到admin登录页面,而不使用我的自定义视图。如何使其重定向到用于所有内容的登录视图,而不是/admin 在您的ROOT_URLCONF文件(默认情况下,在项目的根文件夹中是url.py)中,是否有这样一行: urlpatterns = patterns('', ... (r'^admin/', include(admin.site.urls)), ... ) (r'^admin/', include(myapp.

我创建了自己的登录视图。但是,如果用户直接转到/admin,则会将他们带到admin登录页面,而不使用我的自定义视图。如何使其重定向到用于所有内容的登录视图,而不是/admin

在您的ROOT_URLCONF文件(默认情况下,在项目的根文件夹中是url.py)中,是否有这样一行:

urlpatterns = patterns('',
...
    (r'^admin/', include(admin.site.urls)),
...
)
(r'^admin/', include(myapp.urls)),
{% extends "my-login-page.html" %}
   url(r'^admin/login$', RedirectView.as_view(pattern_name='my_login_page', permanent=True, query_string=True))
如果是这样,您希望将include(admin.site.url)替换为您创建的自定义视图:

(r'^admin/', 'myapp.views.myloginview'),
或者,如果你的应用程序有自己的URL.py,你可以像这样包含它:

urlpatterns = patterns('',
...
    (r'^admin/', include(admin.site.urls)),
...
)
(r'^admin/', include(myapp.urls)),
{% extends "my-login-page.html" %}
   url(r'^admin/login$', RedirectView.as_view(pattern_name='my_login_page', permanent=True, query_string=True))
(

我正试图解决这个问题,我在这个家伙的博客上找到了解决方案。基本上,覆盖管理模板并使用您自己的模板。简而言之,只需在/path to project/templates/admin/中创建一个名为login.html的文件,它将替换管理登录页面。您可以复制原始页面(django/contrib/admin/templates/login.html)并修改一行或两行。如果要完全取消默认登录页面,可以执行以下操作:

urlpatterns = patterns('',
...
    (r'^admin/', include(admin.site.urls)),
...
)
(r'^admin/', include(myapp.urls)),
{% extends "my-login-page.html" %}
   url(r'^admin/login$', RedirectView.as_view(pattern_name='my_login_page', permanent=True, query_string=True))
就是这样。一个文件中有一行。Django真是太棒了。

From-用
login\u required
包装管理员登录页面。例如,在
url.py
中:

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

您可能已经有了中间的两行,甚至可能还有第一行;添加第四行将导致任何可能会影响
管理网站的内容。login
函数使用适当的
next
参数重定向到您的
登录URL

我发现上面的答案不尊重“next”正确查询参数

解决此问题的一个简单方法是使用简单的重定向。在站点的URL文件中,在包含管理员URL的前一个,放置一行如下所示:

urlpatterns = patterns('',
...
    (r'^admin/', include(admin.site.urls)),
...
)
(r'^admin/', include(myapp.urls)),
{% extends "my-login-page.html" %}
   url(r'^admin/login$', RedirectView.as_view(pattern_name='my_login_page', permanent=True, query_string=True))
这是我的解决方案:

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

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

  • 在项目文件夹中找到文件urls.py
  • 将此行添加到导入部分
    从您的应用程序名称导入视图
  • 找到此行
    url(r'^admin/',include(admin.site.url))
  • 在该行上方添加以下内容
    url(r'^admin/login/,视图。您的登录视图),
  • 这是一个例子

        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)),
        ]
    

    我有同样的问题,试图使用已接受的,但有相同的问题,指出在。 然后我做了一些不同的事情,如果这对某人有帮助的话,粘贴在这里

    def staff_or_404(u):
        if u.is_active:
            if u.is_staff:
                return True
            raise Http404()
        return False
    
    admin.site.login = user_passes_test(
            staff_or_404,
        )(admin.site.login)
    

    这个想法是,如果用户登录并试图访问管理员,那么他将获得404。否则,它将迫使您进入正常的登录页面(除非您已经登录)

    虽然@Isaac的解决方案应该拒绝大多数恶意机器人,但它不为专业人员提供保护。当登录用户尝试登录到管理员时,会收到以下消息:

    我们应该改为使用管理员装饰器拒绝所有非特权用户:

    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)
    

    据我所知,decorator在1.9中。

    您可以将管理员登录url重定向到auth login视图:

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('', include('your_app.urls')),
        path('accounts/', include('django.contrib.auth.urls')),
        path('admin/login/', RedirectView.as_view(url='/accounts/login/?next=/admin/', permanent=True)),
        path('admin/', admin.site.urls),
    ]
    

    截至2020年8月,
    django.contrib.admin.sites.AdminSite
    具有一个
    login\u template
    属性。因此,您可以将
    AdminSite
    子类化并指定一个自定义模板,即

    类MyAdminSite(AdminSite):
    login\u template='my\u login\u template.html'
    my_admin_site=MyAdminSite()
    

    然后只需使用
    my_admin_site
    everywhere而不是
    admin.site

    来澄清我想继续使用admin,我只想不使用login admin视图。通过替换include(admin.site.URL))我无法再访问/admin。因此,您想通过用于登录系统其余部分的登录视图登录管理系统吗?是什么机制让视图知道登录的用户是否需要常规登录还是管理员登录?Obv如果用户没有管理员凭据,他们就不能进行管理员登录,但是如果他们有管理员凭据,他们是希望以登录用户还是以登录管理员的身份查看站点?在我的情况下,管理员用户永远不需要访问站点的非管理员部分。因此,我的视图会根据用户类型对其进行重定向。所以,是的,我希望他们看到的登录名与非管理员用户看到的登录名相同。如果go to/已经发生了这种情况,但是如果他们在/admin中将某个内容添加到书签,则会将其发送到admin的login,这是我不希望发生的。因此,管理员用户转到/,使用所有用户都看到的公共登录视图登录,然后获得admin视图。您担心他们会添加书签/admin/which,然后当他们稍后返回该书签时,他们将获得admin视图,而不是常见的登录视图。对吗?没错。我希望所有登录代码都由同一个视图处理,因为我有一些自定义代码用于处理谷歌应用程序的身份验证。它有时需要显示登录成功或失败之外的特殊消息。艾萨克的回答对我来说非常有效。你应该接受他的回答!:)假设我已经作为非工作人员用户登录。如果我再转到
    /admin/
    我仍然会得到默认的登录表单,因为
    login\u required
    不会触发。我已经在我自己的回答中解决了@PēterisCaune的问题。更好的是,
    url(r'^admin/login/$,重定向视图。作为视图(url=settings.login\u url,permanent=True,query\u string=True)),
    。这完全可能(可能)我在做一些愚蠢的事情,但当我这样做时,我最终得到了一个重定向循环,其中
    /admin/login/
    重定向到
    /admin/login/?next=/admin/login/
    ,重定向到
    /admin/login?next=/admin/login/%3Fnext%3D/admin/login/
    ,等@Isaac需要在此处传递
    login\u url
    admin.site.login=staff\u member\u required(admin.site.login,login\u url=settings.login\u url)
    OP,