【问题标题】:How to add event to LeafletWidget in django-leaflet?如何在 django-leaflet 中向 LeafletWidget 添加事件?
【发布时间】:2021-05-27 19:49:08
【问题描述】:

在我的 django 应用程序中,我有一个带有名称和位置(点)的 Worker 模型。使用 django-leflet LeafletWidget 我可以创建一个表单,用户可以在其中设置位置(该工作人员的标记)。 是否可以向小部件添加事件,因此,每次用户设置标记或更改标记位置时,它都会获取该点的坐标并执行其他操作(如 ajax 请求)?

class WorkerForm(forms.ModelForm):
    
    class Meta:
        model = WorkerModel
        exclude = ("id",)
        widgets = {
            'name':forms.TextInput(attrs={'class': 'form-control'}),
            'location': LeafletWidget(),
}

在我刚刚调用的模板中 'forms.location' 它使用控件渲染地图以设置标记

每次用户设置标记时,我都想获取该标记的位置。我该怎么做?

【问题讨论】:

    标签: python django leaflet django-leaflet


    【解决方案1】:

    首先,您应该在表单中添加一个额外的 JavaScript 文件,您可以在其中捕获事件并使用它做任何您喜欢的事情。为此,在表单中添加一个类媒体,并在里面指明 JS 的位置:

    class WorkerForm(forms.ModelForm):
    
        ...
    
        class Media:
            js = ('path/to/script.js',)
    

    在应用的静态目录中的 path/to 目录中创建 script.js 文件。在该 script.js 上,添加以下代码:

    // Wait for the map to be initialized
    $(window).on('map:init', function(e) {
        // Get the Leaflet map instance
        map = e.originalEvent.detail.map;
        // Capture the creation of a new feature
        map.on('draw:created', function (e) {
            const coordinates = e.layer._latlng;
            // Your stuff
        });
        map.on('draw:edited', function (e) {
            var layers = e.layers._layers
            var coordinates;
            Object.keys(layers).forEach(function(key) {
                coordinates = layers[key]._latlng;
            });
            // Your stuff
        });
    });
    

    查看Leaflet Draw documentation 以查看所有可用事件。

    【讨论】:

    • 如果使用事件 map.on('draw:edited ', function (e){ const coordinate = e.layer._latlng; //返回错误});
    • e.layer._latlng 对于 'draw:edited' 事件不存在。编辑时如何获取marker新位置的坐标?
    • @ErnestoRuiz “已编辑”事件将返回您的图层,即使它只有 1 个功能。您必须遍历每个特征(在 Leaflet API 中称为层)以获取它们对应的坐标。我已编辑我的答案以包含此事件。
    • 非常感谢您的帮助。一个小细节:我不得不迭代 e.layers._layers map.on('draw:edited', function (e) { var layers =e.layers._layers var coordinates; Object.keys(layers).forEach(function(键){坐标=层[键]._latlng;console.log(坐标)});call_ajax(坐标);});
    • 我没用过 django-select 也不知道怎么回答这个问题。恐怕我不能提供我的电子邮件。无论如何,您最好的选择是在此处发布您的问题。在这里,您每次都会得到最快最好的答案。如果您没有引起注意,请尝试在问题、您尝试过的事情和遇到的错误中添加更多信息或其他详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多