2013-02-08 3 views
11

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

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

ответ

22

Как что (из памяти):

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' 
+0

Я получаю следующее сообщение об ошибке с этим решением: «AddressAdmin.fieldsets [0] [1] [» поля «]» относится к полю «address_2_html», который отсутствует в форме. –

+1

Если 'display_map3' эквивалентен вашему 'address_2_html' в вашем примере, вы положили 'display_map3' в 'readonly_fields', как в моем примере? – Etienne

+0

Это решение работает для «list_display», но не «fieldsets». –

1

Проблема решена путем переопределения get_fieldsets(), так как get_fieldsets() метод позволяет получить доступ к модели объекта Address.

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 
Смежные вопросы