2009-11-29 82 views
6

在Django應用程序,我有以下型號:添加自定義JS的Django管理領域

class Appointment(models.Model): 
    #some other fields 
    #address fields 
    zipcode=models.CharField(max_length=5) 
    address=models.CharField(max_length=120) 
    latitude=models.FloatField() 
    longitude=models.FloatField() 

當我渲染約會,我只是把一個標記在經度指定的位置和緯度與地址作爲文本,但我需要經緯度來做到這一點。

目前,緯度和經度必須在管理後臺手動輸入,但打開Goog​​le Maps/OSM,搜索地址並輸入緯度和經度是不應該手工完成的工作,所以我想要通過Google Maps API(關鍵字地理編碼)檢索它。

理想情況下,我想有一個按鈕,「獲取座標」旁邊的地址,當被按下時,開始地址解析請求,並在緯度和經度滿時,該地址是明確的,並且呈現結果的地圖,並在填補用戶點擊右側標記時的座標。

我知道該怎麼做,但我不知道我應該怎麼插入標記和代碼到管理後臺。

我已經考慮,但不想做,因爲他們似乎不自然或似乎是這樣一個簡單的任務太多的工作有些事情:

  • 將代碼在地址欄中的描述在從admin.ModelAdmin
  • 投入單獨的模型有關的一切地址,並使用自定義form派生的類field_options(有單獨的模板
  • 創建地址選擇器插件
  • 我們ËGeoDjango內置

回答

3

有這樣做的幾種方法。你已經提到了一些你自己。

的選擇是覆蓋模板,以便在你的管理保存頁面和所需的代碼添加到模板。所需的媒體,Javascript,Css等可以使用ModelAdmin類中的內部Media類來添加。這個媒體類有兩個不同的屬性,一個帶CSS樣式表的元組和一個帶有javascript文件的元組

我認爲對於我自己來說,在這種情況下最好的選擇將是一個自定義地址選擇器小部件,就像您在列表中提到的那樣你不想做的方式。

17

什麼是主要被處理的是客戶端的標記和客戶端JavaScript。既然如此,那麼使用設計來處理這些設施的設施似乎是正確的選擇。我還建議製作一個自定義管理小部件。我自己使用過這種模式。根據客戶端標記的大小,您甚至可以使用Django模板來呈現窗口小部件。

作爲替代方案,你可以寫非侵入式的JavaScript在頁面加載後,重新渲染頁面的那個區域。在這種方法中,你可以簡單地在管理模型中包含那個帶有class Media:的javascript媒體文件。

這更像是僞代碼比什麼,但它給人的想法:

管理。PY

class AppointmentAdmin(admin.ModelAdmin): 
    # ... 

    class Media: 
     from django.conf import settings 
     media_url = getattr(settings, 'MEDIA_URL', '/media') 
     js = [ media_url+'/admin/long-lat-render.js', ] 

長LAT-render.js

// Written for jQuery 
$(function(){ 
    // on page load... 

    $('#_LongitudeTag').html(''); 

    var getCoordButton = $('<button id="get-coords"></button>'); 
    $('#_LongitudeTag').append(getCoordButton); 

    addGMap($('#_LongitudeTag').get(0)); 
}); 

function addGMap(element) { 
    // do whatevers 
} 
+2

Media文件夾是一個有效的文件夾,但我認爲是更好的STATIC_URL 這樣 static_url = GETATTR(設置,「STATIC_URL ','/ static /') js = [static_url +'path/to/my/custom/file.js',] – elin3t 2014-04-15 17:29:04