当前位置: 首页 > news >正文

django admin 设置字段不可编辑

在Django中,如果你想让管理员在后台管理界面中无法编辑某个字段,你可以通过在模型的Meta类中设置editable属性为False,或者在admin.py文件中使用readonly_fields属性来实现。

方法1:在模型中使用Meta类设置
你可以在模型的Meta类中设置editable属性为False,这样在Django的后台管理界面中,这个字段就不会被显示为可编辑的。

from django.db import modelsclass MyModel(models.Model):name = models.CharField(max_length=100, editable=False)class Meta:pass  # 其他元选项可以放在这里

方法2:在admin.py中使用readonly_fields
如果你不希望在模型级别禁用编辑,而是想在特定的admin界面中禁用某些字段的编辑,你可以在admin类中使用readonly_fields属性。

from django.contrib import admin
from .models import MyModelclass MyModelAdmin(admin.ModelAdmin):readonly_fields = ('name',)  # 将'name'字段设置为只读admin.site.register(MyModel, MyModelAdmin)

方法3:自定义表单字段的渲染
如果你想要进一步控制字段的显示方式(例如,即使设置为只读,也希望显示为一个普通的文本字段而不是灰色),你可以通过自定义admin表单来实现。

from django.contrib import admin
from django import forms
from .models import MyModelclass MyModelForm(forms.ModelForm):def __init__(self, *args, **kwargs):super(MyModelForm, self).__init__(*args, **kwargs)self.fields['name'].disabled = True  # 禁用编辑,但仍显示为文本框(在某些浏览器中可能看起来像只读)class MyModelAdmin(admin.ModelAdmin):form = MyModelFormadmin.site.register(MyModel, MyModelAdmin)

方法4:使用JavaScript或CSS隐藏输入框(不推荐)
虽然这种方法可以实现隐藏输入框的效果,但它并不是真正意义上的“不可编辑”,因为用户仍然可以通过开发者工具修改这些隐藏的输入框。因此,这不是一个安全的做法。但如果你只是想在视觉上隐藏这些字段,可以这样做:

<script>document.addEventListener('DOMContentLoaded', (event) => {document.getElementById('id_name').style.display = 'none';  // 假设字段ID是'id_name'});
</script>

或者使用CSS:

#id_name { display: none; }

这种方法应该在自定义模板的JavaScript或CSS文件中使用,而不是直接在Django的admin模板中修改。

结论
推荐使用方法1和方法2,它们提供了真正的不可编辑的解决方案,并且是Django官方推荐的做法。方法3虽然可以实现类似的效果,但在某些情况下可能不完全符合需求,尤其是在涉及到表单验证的情况下。方法4虽然在某些情况下可用,但不推荐用于安全或功能性的需求。

相关文章:

  • php安装swoole扩展
  • 【halcon】tuple_sort_index 和 select_obj 配合使用 详解
  • [特殊字符]实战:使用 Canal + MQ + ES + Redis + XXL-Job 打造高性能地理抢单系统
  • ASP.NET图片盗链防护指南
  • 总线位宽不变,有效数据位宽变化的缓存方案
  • 概率论与统计(不确定性分析)主要应用在什么方面?涉及到具体知识是什么?
  • 深入解析 npm 与 Yarn:Node.js 包管理工具对比与选型指南
  • 考研系列-计算机组成原理第五章、中央处理器
  • Spring Cloud Stream喂饭级教程【搜集全网资料整理】
  • 【Fifty Project - D18】
  • 【Flutter】Unity 三端封装方案:Android / iOS / Web
  • NGINX `ngx_http_core_module` 深度解读与实战指南
  • 晶晨S905L/LB芯片_安卓11.0_已适配移动遥控_支持外置网卡_支持IPV6_通刷线刷包
  • 通过ThreadLocal存储登录用户信息
  • rt-linux下的D状态的堆栈抓取及TASK_RTLOCK_WAIT状态
  • 使用 OpenCV 和 dlib 进行人脸检测
  • ElasticSearch从入门到精通-覆盖DSL操作和Java实战
  • Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理
  • 【玩转 JS 函数式编程_016】DIY 实战:巧用延续传递风格(CPS)重构倒计时特效逻辑
  • 【HarmonyOS 5】鸿蒙检测系统完整性
  • “五一”假期全国口岸日均出入境人员将达215万人次
  • 从世界工厂走向全球创新中心,上海车展为何成为全球汽车行业风向标?
  • 观察|上海算力生态蓬勃发展,如何助力千行百业数智化转型升级
  • 俄总统助理:普京与美特使讨论了恢复俄乌直接谈判的可能性
  • 航天科技集团质量技术部部长严泽想升任集团副总经理
  • 税务部门曝光3起通过拆分经营骗享小规模纳税人税费优惠偷税案件