2013-02-08 132 views
11

我想在數據庫中已存在數據的情況下在管理員窗體上顯示嵌入式地圖。我有以下代碼:如何在django ModelAdmin字段集中調用模型方法?

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的範圍內使用。我使用'描述'嵌入了一張靜態地圖,但這個地圖很酷但不夠酷。

回答

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」是從表單丟失。 – 2013-02-08 17:50:17

+1

如果'display_map3'與您的'address_2_html'相當於您的示例,您是否像在我的示例中那樣將'display_map3'放入'readonly_fields'中? – Etienne 2013-02-08 17:52:59

+0

該解決方案適用於'list_display',但不適用'fieldsets'。 – 2013-02-08 17:53:08

1

問題通過重寫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