2013-02-16 53 views
5

Django Docs state您可以在管理界面中爲只讀字段輸出自定義HTML。這正是我需要的,但它似乎並不奏效。Django管理界面中字段的只讀方法從不稱爲

在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'方法從不會被調用。

有人知道我在做什麼錯嗎?

親切的問候,

帕特里克

回答

11

綜觀 「Django的/的contrib /管理/ 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字段從表單中排除。