【问题标题】:Readonly method for field in Django admin interface is never called从未调用 Django 管理界面中字段的只读方法
【发布时间】:2013-02-01 15:48:28
【问题描述】:

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

在 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 django-admin


    【解决方案1】:

    查看“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 字段留在表单之外。

    【讨论】:

      【解决方案2】:

      关于 readonly 方法的另一件烦人的事情是它消除了错误。所以,如果你有类似的东西

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

      打印和方法都不起作用。

      【讨论】:

        最近更新 更多