Как я могу не использовать просмотр входа в admin Django?

Я создал свой собственный вид для входа. Однако, если пользователь переходит непосредственно к /admin, он приводит их на страницу входа в систему администратора и не использует мое собственное представление. Как я могу сделать его перенаправлением на вид входа, используемый для всего, что не/admin?

Ответы

Ответ 1

От 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)

У вас, вероятно, уже есть две средние линии и, возможно, даже первая строка; добавив, что четвертая строка вызовет все, что попало бы в функцию admin.site.login, чтобы перенаправить на ваш LOGIN_URL с помощью соответствующего параметра next.

Ответ 2

Я обнаружил, что приведенный выше ответ не учитывает "следующий" параметр запроса правильно.

Простым способом решения этой проблемы является использование простой переадресации. В файле urls вашего сайта сразу до, включая URL-адреса администратора, введите следующую строку:

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

Ответ 3

http://blog.montylounge.com/2009/07/5/customizing-django-admin-branding/ (веб-архив)

Я пытаюсь решить именно эту проблему, и я нашел решение в этом блоге. В принципе, переопределите шаблон администратора и используйте свой собственный шаблон. Короче говоря, просто создайте файл login.html в /path -to-project/templates/admin/, и он заменит страницу входа администратора. Вы можете скопировать оригинал (django/contrib/admin/templates/login.html) и изменить строку или две. Если вы хотите полностью удалить страницу входа по умолчанию, вы можете сделать что-то вроде этого:

{% extends "my-login-page.html" %}

Вот оно. Одна строка в одном файле. Django поражает.

Ответ 4

Hola
Я нашел очень простое решение.
Просто скажите django, что URL-адрес для входа администратора - это дескриптор вашего собственного окна просмотра.

Вам просто нужно изменить URL-адрес urls.py(обратите внимание, а не на приложение)

  • В папке PROJECT найдите файл urls.py.
  • Добавьте эту строку в раздел импорта
    from your_app_name import views
  • Найдите эту строку
    url(r'^admin/', include(admin.site.urls))
  • Добавьте выше эту строку следующее 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)),
    ]

Ответ 5

В то время как решение @Isaac должно отклонить большинство вредоносных ботов, оно не обеспечивает защиту профессионального проникновения. Когда вошедший в систему пользователь получает следующее сообщение при попытке войти в систему admin:

Django re-login prompt

Вместо этого мы должны использовать декоратор admin, чтобы отклонить всех непривилегированных пользователей:

from django.contrib.admin.views.decorators import staff_member_required
from django.contrib import admin
[ ... ]
admin.site.login = staff_member_required(admin.site.login)

Насколько мне известно, декоратор был добавлен в 1.9.

Ответ 6

В вашем файле ROOT_URLCONF (по умолчанию он urls.py в корневой папке проекта), есть ли такая строка:

urlpatterns = patterns('',
...
    (r'^admin/', include(admin.site.urls)),
...
)

Если это так, вы хотите заменить include (admin.site.urls) на созданный вами пользовательский вид:

(r'^admin/', 'myapp.views.myloginview'),

или если ваше приложение имеет свой собственный urls.py, вы можете включить его следующим образом:

(r'^admin/', include(myapp.urls)),

Ответ 7

Это мое решение с пользовательским классом AdminSite:

class AdminSite(admin.AdminSite):

    def _is_login_redirect(self, response):
        if isinstance(response, HttpResponseRedirect):
            login_url = reverse('admin:login', current_app=self.name)
            response_url = urllib.parse.urlparse(response.url).path
            return login_url == response_url
        else:
            return False

    def admin_view(self, view, cacheable=False):
        inner = super().admin_view(view, cacheable)

        def wrapper(request, *args, **kwargs):
            response = inner(request, *args, **kwargs)
            if self._is_login_redirect(response):
                if request.user.is_authenticated():
                    return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
                else:
                    return redirect_to_login(request.get_full_path(), reverse('accounts_login'))
            else:
                return response

        return wrapper

Ответ 8

У меня была такая же проблема, я попытался использовать принятый ответ, но имеет ту же проблему, что и в выше. Тогда я сделал что-то другое, вставив сюда, если это будет полезно кому-то.

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. В противном случае он заставит вас перейти на обычную страницу входа (если вы уже не вошли в систему)