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虽然在某些情况下可用,但不推荐用于安全或功能性的需求。

相关推荐
@_猿来如此9 分钟前
Django 实现电影推荐系统:从搭建到功能完善(附源码)
数据库·后端·python·django
noravinsc5 小时前
django filter 排除字段
后端·python·django
noravinsc6 小时前
django filter 日期大于当前日期的
python·django
noravinsc8 小时前
django admin 去掉新增 删除
python·django·sqlite
懵逼的小黑子12 小时前
解释两个 Django 命令 makemigrations和migrate
数据库·django
咖啡调调。18 小时前
使用Django框架表单
后端·python·django
Jamesvalley21 小时前
【Django】新增字段后兼容旧接口 This field is required
后端·python·django
声声codeGrandMaster1 天前
django之账号管理功能
数据库·后端·python·django
noravinsc1 天前
django admin 添加自定义页面
django·自定义·admin