【问题标题】:How do I call a model method in django ModelAdmin fieldsets?如何在 django ModelAdmin 字段集中调用模型方法?
【发布时间】:2013-01-24 12:55:52
【问题描述】:

当数据库中已经存在数据时,我想在管理表单上显示嵌入式地图。我有以下代码:

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.

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

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案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'
    

    【讨论】:

    • 我在使用此解决方案时收到以下错误:'AddressAdmin.fieldsets[0][1]['fields']' 指的是表单中缺少的字段 'address_2_html'。
    • 如果在你的例子中'display_map3'等同于你的'address_2_html',你是否像我的例子一样把'display_map3'放在readonly_fields中?
    • 它在fieldsets 中对我有用。您的代码中的其他地方有问题。
    • 添加 readonly_fields = ['address_2_html'] 选项有帮助。现在可以了。我更喜欢您的解决方案,而不是覆盖 get_fieldsets()。谢谢。
    • 对于 Django 1.9 & +,使用 return format_html(...) 而不是 .allow_tags = True, since deprecated
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2014-02-02
      • 2011-03-31
      • 2021-06-08
      • 2011-04-25
      • 2015-11-03
      • 2020-04-10
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多