永远不会调用Django管理界面中的字段的只读方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了永远不会调用Django管理界面中的字段的只读方法相关的知识,希望对你有一定的参考价值。

Django Docs state,您可以在管理界面中为只读字段输出自定义html。这正是我所需要的,但它似乎不起作用。

在admin.py中:

from django.contrib import admin

class ExampleAdmin(admin.ModelAdmin):
    readonly_fields = ('myfield', )

    def myfield(self, instance):
        print 'This part of the code is never reached!'
        return u'<b>My custom html for the readonly field!</b>'

    myfield.allow_tags = True

admin.site.register(State, StateAdmin)

在models.py中:

class State(models.Model):
    myfield = MyCustomField()
    ... etc ...

class MyCustomField(models.TextField):
    def to_python(self, value):
        ... etc ...

该字段在管理编辑页面上显示为只读。但是,永远不会调用应该创建自定义html的“myfield”方法。

有人知道我做错了什么吗?

亲切的问候,

帕特里克

答案

查看“django / contrib / admin / util.py”文件的lookup_field方法,这似乎是预期的行为。这是您正在使用的代码:

readonly_fields = ('myfield', )

由于myfield是您模型中定义的实际字段,因此在readonly_fields中使用它只会使其不可编辑;它不允许您自定义显示给用户的内容。为了做到这一点,你必须给readonly_fields一些不是真正的领域,如myfield_readonly。然后你必须将你的ModelAdminmyfield方法重命名为myfield_readonly,当然还有myfield.allow_tags = True。您可能还想添加myfield_readonly.short_description = 'My Field'。最后,你要使用myfieldexclude将实际的fields字段留在表单之外。

另一答案

关于readonly方法可能令人烦恼的另一件事是它使错误沉默。所以,如果你有类似的东西

def readonly_field(self, instance):
    errored_calcuated_value = self.kek * instance.peck
    print('wut', errored_calcuated_value)
    return errored_calcuated_value

无论是打印还是方法都无效。

以上是关于永远不会调用Django管理界面中的字段的只读方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Django 管理员只读 textarea 字段

为啥 Django 中的只读表单字段是个坏主意?

为啥 Django 中的只读表单字段是个坏主意?

在第一次保存对象时使 django 模型字段只读或在管理员中禁用

将 Django 管理“添加”界面中的字段拆分为其组成字段

显示聚合的 Django 管理界面