将自定义JS添加到Django管理字段

2024-05-15 05:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

在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()

当我进行预约时,我只是在经纬度指定的位置放置一个标记,地址是文本,但是我需要经纬度来完成这项工作。

目前,纬度和经度必须在管理后端手动输入,但打开Google Maps/OSM,搜索地址并输入纬度和经度是不应该手工完成的工作,所以我想通过Google Maps API(关键字地理编码)检索它。

理想情况下,我希望在地址旁边有一个“获取坐标”按钮,按下该按钮后,将启动地理编码请求,并在地址不含糊时填写纬度和经度,并在用户单击右标记时显示带有结果的地图和填写坐标。

我知道如何做到这一点,但我不确定如何将标记和代码插入到管理后端。

有些事情我已经考虑过了,但不想做,因为它们看起来不自然,或者对于这样一个简单的任务来说似乎太多工作:

  • 将代码放在从admin.ModelAdmin派生的类中field_options中地址字段的描述中
  • 将所有与地址相关的内容放在单独的模型中,并使用自定义的form(使用单独的模板
  • 创建地址选择器小部件
  • 使用GeoDjango

Tags: 标记模型fieldsaddressmodels地址googlelength
2条回答

有几种方法可以做到这一点。你自己也提到过一些。

一个选项是覆盖管理员中保存页面的模板,并将所需的代码添加到模板中。可以使用ModelAdmin类中的内部媒体类添加所需的媒体、Javascript、Css等。这个媒体类有两个不同的属性,一个带有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
}

相关问题 更多 >

    热门问题