如何在Django Admin面板中隐藏BlacklistedToken和OutstandingToken?
解决Django Admin中隐藏BlacklistedToken和OutstandingToken模型的问题
问题分析
使用rest_framework_simplejwt的token_blacklist功能时,该模块会自动将BlacklistedToken和OutstandingToken注册到Django Admin中。直接在项目的admin.py中执行unregister会报错,原因是项目代码的加载顺序早于rest_framework_simplejwt的注册逻辑,执行unregister时模型还未被注册;而先注册再注销的方式仅移除了自己注册的实例,原模块注册的模型仍会显示。
可行解决方案
方案1:利用AppConfig的ready方法延迟注销
通过AppConfig的ready方法,确保在所有模型注册完成后再执行注销操作:
- 在你的主应用目录下创建/修改
apps.py:
from django.apps import AppConfig from django.contrib import admin class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = '你的应用名称' # 替换为实际应用名 def ready(self): # 等待所有模型注册完成后再尝试注销 from rest_framework_simplejwt.token_blacklist.models import BlacklistedToken, OutstandingToken try: admin.site.unregister(BlacklistedToken) admin.site.unregister(OutstandingToken) except admin.exceptions.NotRegistered: pass
- 在
settings.py的INSTALLED_APPS中,将原应用名称替换为上述AppConfig的路径,同时确保你的应用放在rest_framework_simplejwt之后:
INSTALLED_APPS = [ # 其他应用... 'rest_framework_simplejwt', 'rest_framework_simplejwt.token_blacklist', '你的应用名称.apps.YourAppConfig', # 替换为实际路径 ]
方案2:自定义AdminSite过滤模型
如果方案1无效,可以自定义AdminSite,直接过滤掉这两个模型:
- 在应用的
admin.py中定义自定义AdminSite:
from django.contrib.admin import AdminSite from django.contrib import admin class CustomAdminSite(AdminSite): def get_app_list(self, request): app_list = super().get_app_list(request) filtered_apps = [] for app in app_list: if app['app_label'] == 'token_blacklist': # 移除目标模型 app['models'] = [ model for model in app['models'] if model['object_name'] not in ['BlacklistedToken', 'OutstandingToken'] ] # 若该分类下无剩余模型,则不显示 if app['models']: filtered_apps.append(app) else: filtered_apps.append(app) return filtered_apps # 实例化自定义AdminSite admin_site = CustomAdminSite(name='custom_admin') # 手动注册你需要在Admin中显示的模型 # 示例:from .models import YourModel; admin_site.register(YourModel)
- 在项目的
urls.py中替换默认的Admin路由:
from django.urls import path from 你的应用名称.admin import admin_site urlpatterns = [ path('admin/', admin_site.urls), # 其他路由... ]
方案3:移除token黑名单功能(仅适用于不需要该功能的场景)
如果你的项目不需要token黑名单(无需主动注销token),直接从INSTALLED_APPS中移除rest_framework_simplejwt.token_blacklist即可,这两个模型会被自动移除,不会出现在Admin中。
内容的提问来源于stack exchange,提问作者Ashkan Ranjbar
相关产品推荐
相关产品推荐

