Как вызвать метод модели в 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. Мне удалось внедрить статическую карту, используя "описание", которое было круто, но не достаточно прохладно.
Ответы
Ответ 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