首页
技术小册
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快速开发实战
### 46 | Django之美:20行代码实现只读站点ReadOnlyAdmin 在Django框架的广阔天地中,开发者们常常需要构建各式各样的Web应用,从简单的博客系统到复杂的企业级解决方案。在这些应用中,有时出于安全考虑或业务需求,我们可能需要创建一个只读站点,即允许用户浏览数据但不允许修改。虽然Django的Admin界面提供了强大的后台管理功能,但直接支持创建只读视图的原生方式并不明显。幸运的是,通过一些巧妙的技巧和自定义,我们可以在不牺牲太多代码量的情况下,实现一个功能完备的`ReadOnlyAdmin`。 #### 引入场景 设想你正在为一家大型企业开发一个内部管理系统,该系统需要向不同部门的员工展示公司的运营数据。然而,出于数据一致性和安全性的考虑,大多数员工只需查看这些数据而无需修改。此时,创建一个只读的Admin站点就显得尤为重要。 #### Django Admin基础 在开始之前,让我们快速回顾一下Django Admin的基础知识。Django Admin是一个强大的后台管理工具,允许开发者通过简单的注册模型(Model)到Admin站点,就能自动生成数据管理的CRUD(创建、读取、更新、删除)界面。但默认情况下,这些界面都是可编辑的。 #### 实现ReadOnlyAdmin 要实现一个`ReadOnlyAdmin`,我们需要做的是覆盖Admin的某些行为,特别是那些与数据修改相关的部分。具体而言,我们需要重写`ModelAdmin`类的几个方法,以确保所有通过Admin界面进行的修改操作都被阻止。 ##### 步骤一:创建自定义ModelAdmin类 首先,我们需要创建一个继承自`admin.ModelAdmin`的自定义类,并在其中重写关键方法。 ```python from django.contrib import admin from django.http import Http404 from django.shortcuts import redirect class ReadOnlyModelAdmin(admin.ModelAdmin): def has_add_permission(self, request, obj=None): """ 禁止添加新记录 """ return False def has_change_permission(self, request, obj=None): """ 禁止修改现有记录 """ return False def has_delete_permission(self, request, obj=None): """ 禁止删除记录 """ return False def save_model(self, request, obj, form, change): """ 重写save_model方法,使其抛出异常,阻止修改 """ raise Http404("This is a read-only admin site.") def save_formset(self, request, form, formset, change): """ 阻止通过Inline表单集进行的修改 """ raise Http404("This is a read-only admin site.") def changelist_view(self, request, extra_context=None): """ 可以添加额外的上下文或调整视图 """ # 这里可以添加额外的逻辑,比如隐藏某些按钮 extra_context = extra_context or {} extra_context['readonly'] = True return super().changelist_view(request, extra_context=extra_context) ``` ##### 步骤二:将模型注册到ReadOnlyAdmin 接下来,在你的`admin.py`文件中,使用上面定义的`ReadOnlyModelAdmin`类来注册你的模型。 ```python from django.contrib import admin from .models import MyModel # 假设你有一个MyModel模型 admin.site.register(MyModel, ReadOnlyModelAdmin) ``` ##### 步骤三:可选:调整Admin模板以更好地反映只读状态 虽然上面的步骤已经足够让Admin站点变为只读,但你可能还想通过修改Admin模板来进一步增强用户体验,比如隐藏或禁用“添加”、“编辑”和“删除”按钮。这可以通过覆盖Django Admin的模板文件来实现,但需要注意的是,这涉及到对Django Admin内部工作方式的深入理解,并且可能随着Django版本的更新而需要调整。 一个简单的方法是,在你的Django项目中创建一个与Django Admin模板同名的模板文件,并放置在你的项目或应用的`templates/admin/`目录下。Django会优先使用你的自定义模板文件。 #### 安全性与性能考虑 虽然`ReadOnlyAdmin`在功能上满足了只读的需求,但在安全性和性能上仍需注意以下几点: - **权限控制**:确保只有授权用户才能访问只读Admin站点。 - **性能优化**:对于包含大量数据的模型,考虑使用分页、搜索和过滤功能来优化性能。 - **审计日志**:如果需要,可以记录对只读视图的访问,以便进行审计或监控。 #### 总结 通过不到20行代码,我们成功地在Django中创建了一个功能完备的只读Admin站点。这不仅展示了Django框架的灵活性和可扩展性,还体现了其在快速开发方面的优势。在实际开发中,根据具体需求调整和优化`ReadOnlyModelAdmin`类,可以进一步提升用户体验和系统安全性。 此外,值得注意的是,虽然这种方法通过阻止用户界面上的操作来实现了只读功能,但在某些情况下,你可能还需要在数据库层面或模型层面进一步加固安全措施,以确保数据的绝对安全。例如,通过数据库视图或Django的`Manager`类来限制对数据的直接访问。
上一篇:
45 | Django之美:大数据量的关联外键 (autocomplete_fields)
下一篇:
47| Django之美:10行代码自动注册所有Model到Admin管理后台
该分类下的相关小册推荐:
Django零基础入门
Django框架入门指南