ToB企服应用市场:ToB评测及商务社交产业平台

标题: 自定义Admin后台的登录页面 [打印本页]

作者: 海哥    时间: 2022-9-16 17:12
标题: 自定义Admin后台的登录页面
自定义Admin后台的登录页面

(1) 在主应用里创建myadmin.py和myapps.py文件,在myadmin.py文件中定义MyAdminSite类,该类继承父类AdminSite并重写admin_view()和get_urls()方法从而更改Admin后台系统地登录地址。
  1. from django.contrib import admin
  2. from functools import update_wrapper
  3. from django.views.generic import RedirectView
  4. from django.urls import reverse
  5. from django.views.decorators.cache import never_cache
  6. from django.views.decorators.csrf import csrf_protect
  7. from django.http import HttpResponseRedirect
  8. from django.urls import include, path, re_path
  9. from django.contrib.contenttypes import views as contenttype_views
  10. from django.contrib.auth.views import redirect_to_login
  11. class MyAdminSite(admin.AdminSite):
  12.     def admin_view(self, view, cacheable=False):
  13.         def inner(request, *args, **kwargs):
  14.             if not self.has_permission(request):
  15.                 if request.path == reverse('admin:logout', current_app=self.name):
  16.                     index_path = reverse('admin:index', current_app=self.name)
  17.                     return HttpResponseRedirect(index_path)
  18.                 # 修改注销后重新登录的路由地址
  19.                 return redirect_to_login(
  20.                     request.get_full_path(),
  21.                     '/user/login.html'
  22.                 )
  23.             return view(request, *args, **kwargs)
  24.         if not cacheable:
  25.             inner = never_cache(inner)
  26.         if not getattr(view, 'csrf_exempt', False):
  27.             inner = csrf_protect(inner)
  28.         return update_wrapper(inner, view)
  29.     def get_urls(self):
  30.         def wrap(view, cacheable=False):
  31.             def wrapper(*args, **kwargs):
  32.                 return self.admin_view(view, cacheable)(*args, **kwargs)
  33.             wrapper.admin_site = self
  34.             return update_wrapper(wrapper, view)
  35.         urlpatterns = [
  36.             path('', wrap(self.index), name='index'),
  37.             path('login/', RedirectView.as_view(url='/user/login.html')),  # 修改登录页面的路由地址
  38.             path('logout/', wrap(self.logout), name='logout'),
  39.             path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'),
  40.             path(
  41.                 'password_change/done/',
  42.                 wrap(self.password_change_done, cacheable=True),
  43.                 name='password_change_done',
  44.             ),
  45.             path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
  46.             path(
  47.                 'r/<int:content_type_id>/<path:object_id>/',
  48.                 wrap(contenttype_views.shortcut),
  49.                 name='view_on_site',
  50.             ),
  51.         ]
  52.         valid_app_labels = []
  53.         for model, model_admin in self._registry.items():
  54.             urlpatterns += [
  55.                 path('%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
  56.             ]
  57.             if model._meta.app_label not in valid_app_labels:
  58.                 valid_app_labels.append(model._meta.app_label)
  59.         if valid_app_labels:
  60.             regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
  61.             urlpatterns += [
  62.                 re_path(regex, wrap(self.app_index), name='app_list'),
  63.             ]
  64.         return urlpatterns
复制代码
上述代码比较固定,只需根据需求更改注释部分的地址即可。
(2) 将自定义的MyAdminSite类进行系统注册,由MyAdminSite类实例化创建Admin后台系统,在myapps.py中定义系统注册类MyAdminConfig.
  1. from django.contrib.admin.apps import AdminConfig
  2. class MyAdminConfig(AdminConfig):
  3.     default_site = 'myblog.myadmin.MyAdminSite'
复制代码
(3) 在settings.py文件的INSTALLED_APPS中配置系统注册类MyAdminConfig。
  1. # 需要将原来的 'django.contrib.admin' 注释掉
  2. INSTALLED_APPS = [
  3.     # 'django.contrib.admin',
  4.     'myblog.myapps.MyAdminConfig',
  5.     'django.contrib.auth',
  6.     'django.contrib.contenttypes',
  7.     'django.contrib.sessions',
  8.     'django.contrib.messages',
  9.     'django.contrib.staticfiles',
  10. ]
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4