如何在Django admin面板中隐藏rest_framework.authtoken的Token模型
Django admin隐藏DRF Token模型的正确实现方法
报错原因
你遇到的The model Token is not registered报错是因为unregister代码的执行时机早于rest_framework.authtoken完成admin注册的时机,执行注销操作时模型还没被注册到admin站点,自然抛出未注册错误。
实现方案
方案1:调整APP注册顺序(简单易用)
- 首先修改项目
settings.py的INSTALLED_APPS配置,确保你要写入注销代码的自定义APP,排序在rest_framework.authtoken之后:
INSTALLED_APPS = [ # Django原生APP 'django.contrib.admin', 'django.contrib.auth', # ... 其他原生依赖 'rest_framework', 'rest_framework.authtoken', # DRF的token模块先注册 'your_custom_app' # 你的自定义APP放在后面 ]
- 在你的自定义APP的
admin.py文件中加入以下代码:
from django.contrib import admin from rest_framework.authtoken.models import TokenProxy # 优先判断是否已注册,避免重复执行报错 if admin.site.is_registered(TokenProxy): admin.site.unregister(TokenProxy)
方案2:使用AppConfig的ready钩子(更稳定,无需调整APP顺序)
不需要调整INSTALLED_APPS的排序,通过Django应用启动完成后的自动回调执行注销操作:
- 修改自定义APP的
apps.py文件,给对应的AppConfig类添加ready方法:
from django.apps import AppConfig class YourCustomAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_custom_app' def ready(self): from django.contrib import admin from rest_framework.authtoken.models import TokenProxy if admin.site.is_registered(TokenProxy): admin.site.unregister(TokenProxy)
- 检查
settings.py的INSTALLED_APPS配置,确保你的自定义APP注册的是上面的AppConfig类:
INSTALLED_APPS = [ # ... 其他依赖 'rest_framework.authtoken', 'your_custom_app.apps.YourCustomAppConfig' # 注册AppConfig而不是直接写APP名 ]
注意事项
- 如果你使用的是3.12.0之前的旧版本DRF,admin注册的是原生
Token模型,把上面代码中的TokenProxy替换为Token即可 - 保留
admin.site.is_registered()的判断逻辑,可以避免服务重启、代码热重载时重复执行注销操作抛出的异常
内容的提问来源于stack exchange,提问作者diego249
相关产品推荐
相关产品推荐

