首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
03 | 初识Django:Django适合做什么?
04 | 用2个命令创建一个包含用户管理功能的后台
05 | 职位管理系统:开始Django之旅 :创建一个可以管理职位的后台
06 | 职位管理系统:产品体验优化:快速迭代完善应用
07 | 职位管理系统:添加自定义页面:让匿名用户可以浏览职位列表页
08 | 职位管理系统:添加自定义页面:让匿名用户可以查看职位详情
09 | 招聘评估系统:产品背景、迭代思维与MVP产品规划
10 | 招聘评估系统:唯快不破:在产品中使用产品迭代思维
11 | 招聘评估系统:数据建模 & 企业级数据库设计原则
12 | 招聘评估系统:创建应用和模型,分组展示页面内容
13 | 招聘评估系统:如何批量从Excel文件导入候选人数据
14 | 招聘评估系统:产品体验优化:候选人列表筛选和查询
15 | 招聘评估系统:省去单独的账号管理工作:企业域账号集成
16 | 招聘评估系统:批量设置面试官:面试官的导入、授权
17 | 招聘评估系统:产品新需求 :如何导出候选人的数据到CSV
18 | 招聘评估系统:如何记录日志方便排查问题
19 | 招聘评估系统:生产环境与开发环境配置分离
20 | 招聘评估系统:产品细节完善
21 | 简历投递和面试流程:定制更美观的主题
22 | 简历投递和面试流程:定制面试官权限
23 | 简历投递和面试流程:钉钉群消息集成&通知一面面试官
24 | 简历投递和面试流程:允许候选人注册登录: 集成Registration
25 | 简历投递和面试流程:候选人简历存储:创建简历Model
26 | 简历投递和面试流程:让候选人可以在线投递简历
27 | 简历投递和面试流程:使用Bootstrap来定制页面样式
28 | 简历投递和面试流程:简历评估&安排一面面试官
29 | 简历投递和面试流程:定制列表字段,查看简历详情
30 | 简历投递和面试流程:为已有系统数据库生成管理后台
31 | Django的中间件(Middleware)
32 | 创建请求日志、性能日志记录中间件
33 | 在Django中支持多语言
34 | 错误和异常日志上报:Sentry集成
35 | 错误和异常日志上报:捕获异常上报到Sentry并发送钉钉群通知
36 | Django安全防护:防止XSS跨站脚本攻击
37 | Django安全防护:CSRF跨站请求伪造和SQL注入攻击
38 | Django Rest Framework开放API
39 | 在Django中使用缓存&Redis的使用
40 | Django与Celery 集成:Celery的使用
41 | Django与Celery集成:异步任务
42 | Django与Celery集成:定时任务
43 | 文件和图片上传功能
44 | 实践中的问题:多数据库路由
45 | Django之美:大数据量的关联外键 (autocomplete_fields)
46 | Django之美:20行代码实现只读站点ReadOnlyAdmin
47| Django之美:10行代码自动注册所有Model到Admin管理后台
48 | Django之美:Signals信号及其使用场景
49 | Django之美:CSR架构总结之Celery
50 | Django之美:Sentry&Django Rest Framework
51 | Django之美:Django的常用插件
52 | 生产环境要注意哪些事项:生产环境的应用部署
53 | 应用水平扩展:使用负载均衡
54 | 让网站访问更快:使用CDN加速
55 | 让故障在第一时间被感知到:接入监控告警
56 | 生产环境中的安全:生产环境的安全设计
57 | 生产环境中的安全:应用安全
58 | 生产环境中的安全:架构安全
59 | 生产环境中的安全:数据安全
60 | 生产环境中的安全:密码安全与业务安全
61 | 云环境中的部署:Docker容器的基础用法
62 | 云环境中的部署:如何像分发集装箱一样发布应用
63 | 云环境中的部署:开发环境的容器化&构建小镜像
64 | 云环境中的部署:什么时候需要容器编排
65 | 云环境中的部署:阿里云上搭建Kubernetes集群
66 | 云环境中的部署:管理监控容器中的Django应用
67 | 云环境中的部署:应用日志收集与查询
68 | 云环境中的持续集成:CI/CD的工作流程
69 | 云环境中的持续集成:CI/CD的基本使用
当前位置:
首页>>
技术小册>>
Django快速开发实战
小册名称:Django快速开发实战
### 47 | Django之美:10行代码自动注册所有Model到Admin管理后台 在Django的广阔世界里,Admin管理后台无疑是其最为人称道的特性之一。它不仅为开发者提供了一个直观、强大的界面来管理数据库中的记录,还极大地简化了后台管理功能的开发过程。然而,随着项目规模的扩大,模型(Model)的数量也会显著增加。如果每个模型都需要手动在`admin.py`文件中注册,这无疑会成为一个繁琐且易出错的任务。幸运的是,Django的灵活性和可扩展性允许我们通过编写一小段代码,实现自动注册所有模型到Admin管理后台的功能,这正是本章所要探讨的“Django之美”。 #### 一、为什么需要自动注册 在大型Django项目中,模型的数量可能达到几十甚至上百个。如果每个模型都需要在`admin.py`中显式注册,那么这个文件将会变得非常庞大且难以维护。此外,每当添加或删除模型时,都需要记得更新`admin.py`,这无疑增加了出错的风险。自动注册机制能够极大地简化这一过程,使得开发者能够专注于业务逻辑的实现,而不是花费大量时间在重复性的注册操作上。 #### 二、Django Admin的基础 在深入探讨自动注册之前,有必要先回顾一下Django Admin的基础知识。Django的Admin管理后台是通过`django.contrib.admin`应用提供的。要在Admin中管理某个模型,首先需要确保该模型所在的app在`INSTALLED_APPS`中已注册,然后在该app的`admin.py`文件中,使用`admin.site.register(ModelClass)`方法将模型注册到Admin中。 #### 三、实现自动注册的逻辑 自动注册所有模型到Admin管理后台的核心思想是利用Django的元编程(Metaprogramming)能力,动态地遍历应用中的所有模型,并自动将它们注册到Admin中。这通常可以通过编写一个自定义的`admin.py`文件或者一个可重用的Django应用来实现。 ##### 1. 编写自定义`admin.py` 首先,我们可以尝试在项目的某个`admin.py`文件中(通常是项目的根目录或者某个特定应用的目录下),编写一个自定义的注册函数,该函数遍历所有已安装的Django应用,并尝试注册其中的模型。 ```python from django.contrib import admin from django.apps import apps def autodiscover_models_and_register(): for app_config in apps.get_app_configs(): for model_name, model in app_config.models.items(): # 这里可以添加条件来排除某些不需要注册的模型 if not model._meta.abstract: # 排除抽象基类 admin.site.register(model) # 在文件末尾调用该函数以注册所有模型 autodiscover_models_and_register() ``` 注意:上面的代码示例会注册所有非抽象的模型到Admin中。然而,在实际应用中,我们可能希望根据模型的某些特性(如是否包含特定的Meta选项)来决定是否注册。此外,如果模型有自定义的Admin类,上述方法也无法直接支持。 ##### 2. 使用可重用的Django应用 为了更灵活地实现自动注册功能,我们可以创建一个可重用的Django应用,该应用提供自定义的Admin注册逻辑。这个应用可以包含一个配置文件(如`settings.py`),用于指定哪些应用或模型应该被自动注册,以及是否使用自定义的Admin类。 ```python # 假设我们在一个名为`autodiscover_admin`的应用中实现此功能 # autodiscover_admin/autodiscover.py from django.contrib import admin from django.apps import apps from django.conf import settings def register_models(site=admin.site): excluded_apps = getattr(settings, 'AUTODISCOVER_ADMIN_EXCLUDE_APPS', []) excluded_models = getattr(settings, 'AUTODISCOVER_ADMIN_EXCLUDE_MODELS', []) for app_config in apps.get_app_configs(): if app_config.name in excluded_apps: continue for model_name, model in app_config.models.items(): if model_name in excluded_models: continue # 检查是否有自定义的Admin类 custom_admin_class = None try: custom_admin_class_str = f'{app_config.name}.admin.{model_name}Admin' custom_admin_class = globals()[custom_admin_class_str] except (KeyError, AttributeError): pass if custom_admin_class: site.register(model, custom_admin_class) else: site.register(model) # 在应用的`apps.py`或其他合适的文件中调用该函数 # 注意:实际调用时机可能需要根据项目的具体需求来确定 ``` 在这个示例中,我们通过检查Django的设置(`settings.py`)来确定哪些应用或模型应该被排除在自动注册之外,并且支持使用自定义的Admin类。这样,开发者就可以通过简单地修改设置文件来控制哪些模型被注册到Admin中,而无需修改自动注册的逻辑代码。 #### 四、注意事项与最佳实践 - **性能考虑**:虽然自动注册功能在开发过程中非常方便,但在生产环境中,如果模型数量非常多,可能会导致Admin加载速度变慢。因此,在生产环境中,建议仔细评估是否真的需要自动注册所有模型。 - **安全性**:自动注册可能会暴露一些原本不打算通过Admin管理的模型。因此,在启用自动注册功能时,务必确保这些模型的数据是安全的,或者通过适当的权限控制来限制对这些模型的访问。 - **自定义Admin界面**:如果模型需要复杂的Admin界面(如内联模型、自定义字段显示等),那么自动注册可能无法满足需求。在这种情况下,建议为这些模型编写专门的Admin类,并在`admin.py`中显式注册。 - **文档与测试**:随着项目的发展,模型的数量和复杂性都会增加。因此,在启用自动注册功能后,务必编写足够的文档和测试来确保Admin界面的正确性和稳定性。 #### 五、结语 通过实现自动注册所有模型到Django Admin管理后台的功能,我们不仅能够简化开发过程,提高开发效率,还能够保持代码的整洁和可维护性。然而,这也需要我们在享受便利的同时,时刻关注性能、安全性和可定制性等方面的问题。希望本章的内容能够为你在Django项目中实现自动注册功能提供一些有益的参考和启示。
上一篇:
46 | Django之美:20行代码实现只读站点ReadOnlyAdmin
下一篇:
48 | Django之美:Signals信号及其使用场景
该分类下的相关小册推荐:
Django零基础入门
Django框架入门指南