django admin 设置字段不可编辑

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

方法1:在模型中使用Meta类设置

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

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

方法2:在admin.py中使用readonly_fields

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

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

方法3:自定义表单字段的渲染

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

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

方法4:使用JavaScript或CSS隐藏输入框(不推荐)

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

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

或者使用CSS:

css 复制代码
#id_name { display: none; }

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

结论

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

相关推荐
w236173460118 小时前
Django框架漏洞深度剖析:从漏洞原理到企业级防御实战指南——为什么你的Django项目总被黑客盯上?
数据库·django·sqlite
大叔_爱编程1 天前
p024基于Django的网上购物系统的设计与实现
python·django·vue·毕业设计·源码·课程设计·网上购物系统
noravinsc1 天前
e.g. ‘django.db.models.BigAutoField‘.
数据库·django
Q_Q19632884751 天前
python的漫画网站管理系统
开发语言·spring boot·python·django·flask·node.js·php
noravinsc2 天前
redis是内存级缓存吗
后端·python·django
百锦再2 天前
大数据技术的主要方向及其应用详解
大数据·linux·网络·python·django·pygame
noravinsc2 天前
django中用 InforSuite RDS 替代memcache
后端·python·django
Q_Q19632884752 天前
python的家教课程管理系统
开发语言·spring boot·python·django·flask·node.js·php
noravinsc2 天前
人大金仓数据库 与django结合
数据库·python·django
wxin_VXbishe3 天前
springboot旅游小程序-计算机毕业设计源码76696
java·spring boot·python·spring·django·sqlite·flask