Подтвердить что ты не робот

Как вызвать метод модели в django ModelAdmin fieldsets?

Я хочу отобразить встроенную карту в форме администратора, когда данные уже существуют в db. У меня есть следующий код:

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.

Еще одна вещь, которую я пробовал, заключалась в использовании опции 'description' для 'fieldsets', однако 'address_2_html' недоступен в области AddressAdmin. Мне удалось внедрить статическую карту, используя "описание", которое было круто, но не достаточно прохладно.

4b9b3361

Ответ 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'

Ответ 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