如何在django ModelAdmin字段集中调用模型方法?

nu *_*est 13 python django django-models django-admin

我希望在数据库中已存在数据时在管理表单上显示嵌入式映射.我有以下代码:

models.py

class Address(models.Model):
    address = models.CharField()

    def address_2_html(self):
        if self.address:
            # Return html for an embedded map using the entered address.
            return embedded_map_html
        else:
            return ''
    address_2_html.allow_tags = True
Run Code Online (Sandbox Code Playgroud)

admin.py

class AddressAdmin(admin.ModelAdmin):
    fieldsets = [(label, {'fields': ['address','address_2_html']}),]
Run Code Online (Sandbox Code Playgroud)

这不起作用.我收到一个错误:

'AddressAdmin.fieldsets[1][1]['fields']' refers to field 'address_2_html' that is missing from the form.
Run Code Online (Sandbox Code Playgroud)

我尝试的另一件事是使用'fieldsets'的'description'选项,但是,在AddressAdmin的范围内无法访问'address_2_html'.我确实成功地使用"描述"嵌入了静态地图,这很酷但不够酷.

Eti*_*nne 23

像那样(来自记忆):

class AddressAdmin(admin.ModelAdmin):
    fieldsets = [(label, {'fields': ['address','address_2_html']}),]
    readonly_fields = ['address_2_html']

    def address_2_html(self, obj):
        return obj.address_2_html()
    address_2_html.allow_tags = True
    address_2_html.short_description = 'Address display'
Run Code Online (Sandbox Code Playgroud)

  • 添加readonly_fields = ['address_2_html']选项有帮助.它现在有效.我更喜欢你的解决方案,而不是覆盖get_fieldsets().谢谢. (8认同)
  • 如果 'display_map3' 等同于您的示例中的 'address_2_html',您是否像在我的示例中那样将 'display_map3' 放在了 `readonly_fields` 中? (2认同)
  • 对于Django 1.9和+,[因为不推荐使用],所以请使用`return format_html(...)`而不是`.allow_tags = True`(https://docs.djangoproject.com/zh-CN/1.9/ref/contrib/admin/ )。 (2认同)