Django管理接口中字段的Readonly方法从未被调用


Django Docs声明您可以在管理界面中为只读字段输出自定义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"方法从未被调用。

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

问候,

Patrick

查看"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'。最后,您需要使用excludefields将实际的myfield字段排除在表单之外。

只读方法的另一个令人讨厌的地方是它使错误静音。所以,如果你有类似的东西

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

打印和方法都不起作用。

最新更新