自定义Admin后台的登录页面

自定义Admin后台的登录页面

(1) 在主应用里创建myadmin.py和myapps.py文件,在myadmin.py文件中定义MyAdminSite类,该类继承父类AdminSite并重写admin_view()和get_urls()方法从而更改Admin后台系统地登录地址。

from django.contrib import admin
from functools import update_wrapper
from django.views.generic import RedirectView
from django.urls import reverse
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
from django.http import HttpResponseRedirect
from django.urls import include, path, re_path
from django.contrib.contenttypes import views as contenttype_views
from django.contrib.auth.views import redirect_to_login
class MyAdminSite(admin.AdminSite):
    def admin_view(self, view, cacheable=False):
        def inner(request, *args, **kwargs):
            if not self.has_permission(request):
                if request.path == reverse('admin:logout', current_app=self.name):
                    index_path = reverse('admin:index', current_app=self.name)
                    return HttpResponseRedirect(index_path)
                # 修改注销后重新登录的路由地址
                return redirect_to_login(
                    request.get_full_path(),
                    '/user/login.html'
                )
            return view(request, *args, **kwargs)
        if not cacheable:
            inner = never_cache(inner)
        if not getattr(view, 'csrf_exempt', False):
            inner = csrf_protect(inner)
        return update_wrapper(inner, view)

    def get_urls(self):
        def wrap(view, cacheable=False):
            def wrapper(*args, **kwargs):
                return self.admin_view(view, cacheable)(*args, **kwargs)
            wrapper.admin_site = self
            return update_wrapper(wrapper, view)
        urlpatterns = [
            path('', wrap(self.index), name='index'),
            path('login/', RedirectView.as_view(url='/user/login.html')),  # 修改登录页面的路由地址
            path('logout/', wrap(self.logout), name='logout'),
            path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'),
            path(
                'password_change/done/',
                wrap(self.password_change_done, cacheable=True),
                name='password_change_done',
            ),
            path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
            path(
                'r/<int:content_type_id>/<path:object_id>/',
                wrap(contenttype_views.shortcut),
                name='view_on_site',
            ),
        ]
        valid_app_labels = []
        for model, model_admin in self._registry.items():
            urlpatterns += [
                path('%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
            ]
            if model._meta.app_label not in valid_app_labels:
                valid_app_labels.append(model._meta.app_label)
        if valid_app_labels:
            regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
            urlpatterns += [
                re_path(regex, wrap(self.app_index), name='app_list'),
            ]
        return urlpatterns

上述代码比较固定,只需根据需求更改注释部分的地址即可。

(2) 将自定义的MyAdminSite类进行系统注册,由MyAdminSite类实例化创建Admin后台系统,在myapps.py中定义系统注册类MyAdminConfig.

from django.contrib.admin.apps import AdminConfig
class MyAdminConfig(AdminConfig):
    default_site = 'myblog.myadmin.MyAdminSite'

(3) 在settings.py文件的INSTALLED_APPS中配置系统注册类MyAdminConfig。

# 需要将原来的 'django.contrib.admin' 注释掉
INSTALLED_APPS = [
    # 'django.contrib.admin',
    'myblog.myapps.MyAdminConfig',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:自定义Admin后台的登录页面 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Django-rest-framework开发api接口

    django-rest-framework开发api接口 (1) 创建django项目drfdemo1并且创建一个名为app的应用 django-admin startproject drfdemo1 python manage.py startapp app (2) 安装django-rest-framework pip install djangores…

    Python开发 2023年4月2日
    00
  • 使用django+websocket+redis+channels实现简易聊天室

    使用django+websocket+redis+channels实现简易聊天室 1.创建一个django项目 从存储项目的文件夹进入cmd命令行终端,输入以下命令创建chatroom项目 django-admin startproject chatroom 然后再进入项目文件夹,打开cmd命令行终端,输入以下命令创建chat应用 python manage…

    2023年4月2日
    00
  • django中资源文件夹的引入

    django中资源文件夹的引入 1.静态资源文件夹的引入 settings.py的配置如下所示: # django默认配置 STATIC_URL=’static/’ # django会去应用里面的static文件夹找静态资源,仅当DEBUG为True时 # BASE_DIR是项目的绝对地址 STATIC_ROOT=BASE_DIR / ‘static’ # …

    Python开发 2023年4月2日
    00
  • 使用python爬取微博评论

    最近在复习以前学习的python爬虫内容,就拿微博来练了一下手,这个案例适合学习爬虫到中后期的小伙伴,因为他不是特别简单也不是很难,关键是思路,为什么说不是很难呢?因为还没涉及到js逆向,好了话不多说开干。 (1)找到要爬取的页面,如下: (2)点开评论,拉到最下方,如下位置: 点击“点击查看”进入另一个页面,如下所示: 这里会显示更多评论,但是不是全部,随…

    2023年4月2日
    00
  • django原生api接口

    django原生api接口 1.1 创建django项目 django-admin startproject drfdemo1 1.2 创建app django-admin startapp app 1.3 创建数据模型 app/models.py中编写如下代码: from django.db import models class studentsInfo…

    2023年4月2日
    00
  • Django中封装分页组件

    Django中封装分页组件 (1) 定义Paginator类 from django.utils.safestring import mark_safe class Paginator(object): “”” 初始化参数说明: request:请求对象 data:查询到的符合条件的数据 search_data:搜索框收索的关键字,解决收索情况下分页的BUG…

    Python开发 2023年4月2日
    00
  • 树结构

    树结构 1.1 树的定义 树(Tree):个节点构成的有限集合。当n = 0时,称为空树。对于任一棵非空树(n>0),它具备以下性质: 树中有一个称为”根(Root)”的特殊节点,用r表示;其余节点可分为m(m>0)个互不相交的有限集、,…,,其中每个集合本身又是一棵树,称为原来树的子树(SubTree)。如下图: 1.2 树结构的术语 树结…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部