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