如何调用在Django的ModelAdmin字段集模型的方法?(How do I call a mo

2019-08-16 20:53发布

我想,当数据在数据库中已存在显示管理员窗体上的嵌入式地图。 我有以下代码:

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

admin.py

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

这是行不通的。 我得到一个错误:

'AddressAdmin.fieldsets[1][1]['fields']' refers to field 'address_2_html' that is missing from the form.

我想另一件事是使用“字段集”的“说明”选项,但是,“address_2_html”不是AddressAdmin的范围内使用。 我没有在嵌入使用“说明”这是很酷的静态地图会成功,但没有足够的冷静。

Answer 1:

这样的(从内存中):

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'


Answer 2:

问题通过重写get_fieldsets解决(),因为get_fieldsets()方法允许访问模型对象地址。

def get_fieldsets(self, request, obj=None):
    fs = [
        (self.label,  {'fields': ['address',]}),
        ('Map', {'fields': [], # required by django admin
                'description':obj.address_2_html(),
         }),
    ]
    return fs


文章来源: How do I call a model method in django ModelAdmin fieldsets?