添加自定义JS的Django管理领域

问题描述:

在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内置

有这样做的几种方法。你已经提到了一些你自己。

的选择是覆盖模板,以便在你的管理保存页面和所需的代码添加到模板。所需的媒体,Javascript,Css等可以使用ModelAdmin类中的内部Media类来添加。这个媒体类有两个不同的属性,一个带CSS样式表的元组和一个带有javascript文件的元组

我认为对于我自己来说,在这种情况下最好的选择将是一个自定义地址选择器小部件,就像您在列表中提到的那样你不想做的方式。

什么是主要被处理的是客户端的标记和客户端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