在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()
当我渲染一个约会时,我只是将一个标记放在经度和纬度指定的位置,地址为文本,但我需要纬度和经度才能做到。
目前,必须在管理员后端手动输入纬度和经度,但打开谷歌地图/ OSM,搜索地址并输入纬度和经度是不必手动完成的工作,所以我想要通过Google Maps API(关键字地理编码)检索它。
理想情况下,我希望地址旁边有一个“获取坐标”按钮,当按下该按钮时,会启动地理编码请求,并在地址明确时填写纬度和经度,并显示带有结果的地图并填充坐标当用户点击右侧标记时。
我知道怎么做,但我不确定如何将标记和代码插入管理员后端。
我已经考虑过但不想做的一些事情,因为它们看起来并不自然,或者看起来对于这么简单的任务似乎太过分了:
field_options
的地址字段的描述中,该类来自admin.ModelAdmin
form
(使用单独的模板答案 0 :(得分:19)
主要处理的是客户端标记和客户端javascript。在这种情况下,似乎使用旨在处理这些设施的设施将是正确的选择。我还建议制作自定义管理窗口小部件。我自己用过这种模式。根据客户端标记的大小,您甚至可以使用Django模板来呈现小部件。
作为替代方案,您可以编写非侵入式JavaScript以在页面加载后重新呈现页面的该区域。在此方法中,您只需在管理模型中包含class Media:
的javascript媒体文件。
这更像是伪代码而不是任何东西,但它提出了这个想法:
<强> admin.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
}
答案 1 :(得分:3)
有几种方法可以做到这一点。你自己已经提到了一些。
一个选项是覆盖管理员中保存页面的模板,并将所需的代码添加到模板中。可以使用ModelAdmin类中的内部Media类添加所需的媒体,Javascript,Css等。这个媒体类有两个不同的属性,一个带有css样式表的元组和一个带有javascript文件的元组
我认为,在这种情况下,最好的选择是自定义地址选择器窗口小部件,正如您在不希望的方式列表中提到的那样。