django modeladmin、只读字段与布尔字段

2 投票
1 回答
1857 浏览
提问于 2025-04-18 00:14

我有一个简单的模型,其中有一个布尔字段(就是可以是“真”或“假”的字段),还有相关的管理界面:

# in models.py
class MyModel(models.Model):
    ...
    my_field = models.BooleanField(...)

# in admin.py
class MyModelAdmin(admin.ModelAdmin):

    readonly_fields ("my_field", ...)

我的问题是,现在这个布尔字段总是显示为空,不管它实际的值是什么。

我找不到解决这个问题的方法,这个问题只发生在我身上吗?

我不知道这是否重要,但我使用的是grappelli版本2.4.5。

谢谢!

1 个回答

1

好的,

经过一番搜索,我找到了一种解决办法(虽然还有改进空间,但这是个不错的起点)。我在自己实现的 ModelAdmin 中重写了 get_form(...) 方法:

def get_form(self, *args, **kwargs):

    form = super(SupplierAdmin, self).get_form(*args, **kwargs)

    for field_name in self.fake_readonly_fields:
        form.base_fields[field_name].widget.attrs["disabled"] = "disabled"


    return form

我把只读字段的列表改名为 fake_readonly_fields,这样就不会和 Django 的 readonly_fields 混淆了。这种方法适用于文本框、复选框和下拉选择框(我想单选按钮也可以,但我没验证过……)。现在我在寻找上传文件输入的解决方案……

顺便说一下,我不知道这个解决方案是否会引发“安全”问题(比如,有人可能通过特制的信息绕过我设置为禁用的 HTML 字段,传递新数据来覆盖旧值……)但这又是另一个(依然重要)话题。

撰写回答