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”方法。
有人知道我做错了吗?
亲切的问候,
帕特里克
答案 0 :(得分:12)
查看“django / contrib / admin / util.py”文件的lookup_field
方法,这似乎是预期的行为。以下是您正在使用的代码:
readonly_fields = ('myfield', )
由于myfield
是您模型中定义的实际字段,因此在readonly_fields
中使用该字段只会使其不可编辑;它不允许您自定义显示给用户的内容。为此,您必须提供readonly_fields
不属于实际字段的内容,例如myfield_readonly
。然后,您必须将ModelAdmin
的{{1}}方法重命名为myfield
,当然还有myfield_readonly
。您可能还想添加myfield.allow_tags = True
。最后,您要使用myfield_readonly.short_description = 'My Field'
或myfield
将实际的exclude
字段保留在表单之外。
答案 1 :(得分:0)
关于只读方法的另一件令人讨厌的事情是它使错误静音。所以,如果您有类似的东西
def readonly_field(self, instance):
errored_calcuated_value = self.kek * instance.peck
print('wut', errored_calcuated_value)
return errored_calcuated_value
它既不能打印也不能使用方法。