在 Django 模型中保存传单标记
save leaflet marker in django model
我想用 django 创建一个网络应用程序,用户可以在其中在地图上创建标记。
我有这个 js 脚本,可以通过单击传单地图来添加标记。
window.onload = function () {
element = document.getElementById('osm-map');
var markers_list = new Array()
var map = L.map(element);
let rm = false
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// var markers = L.featureGroup([])
var target = L.latLng('48.8686034651125', '2.34261607443957');
map.setView(target, 5);
map.on('click', function (e) {
var node = document.createElement("LI")
var marker = new L.marker(e.latlng).addTo(map);
markers_list.push(marker);
var marker_id = marker._leaflet_id
let title_marker = window.prompt("give a name to your marker",marker_id);
//todo make sure input is not empty
while (!title_marker){
title_marker = window.prompt("give a non empty name",marker_id);
}
marker.bindPopup("marker's info: "+title_marker).openPopup()
map.addLayer(marker)
a = document.createElement('a')
a.innerHTML=title_marker
a.setAttribute('id', marker_id)
a.setAttribute('href',"javascript:void(0);");
node.appendChild(a);
document.getElementById("marker-list").appendChild(node)
}
);
rm_btn.onclick = function () { // function to enable edit of marker
rm = !rm
if (rm) {
document.getElementById('rm_btn').innerHTML = "Edition enabled";
}
else {
document.getElementById('rm_btn').innerHTML = "Edition disabled";
}
}
var ul = document.getElementById('marker-list'); //list of li marker
ul.onclick = function(e) {
if (rm) {
id_to_rem = e.target.id
for(var i=0;i<markers_list.length;i++){// iterate over layer to remove marker from map
if (markers_list[i]._leaflet_id == id_to_rem){
map.removeLayer(markers_list[i])
}
}
var a_list = ul.getElementsByTagName('a')
for(var i=0;i<a_list.length;i++){// iterate over ul to remove marker from li
if (a_list[i].id == id_to_rem){
ul.removeChild(ul.childNodes[i+1])
}
}
};
}
}
标记保存在标记列表数组中。如何将这些标记保存在 django 模型中。我必须在 html 模板中放置一个脚本标签然后做一些 django 的事情还是有其他解决方案?
谢谢
你的问题很宽泛。因此,我不会为所需的所有不同部分(模型、视图、url、模板、js 脚本)编写代码,而是提供一个大纲,您可以使用它来进一步缩小问题范围。
根据您的应用程序逻辑和偏好,您的数据应使用 AJAX 或作为表单提交提交。如果您需要在没有“页面刷新”的情况下提交数据,请使用 AJAX。如果用户没有最终提交操作,那么AJAX从用户体验的角度来说肯定会更好。
AJAX
有许多在线资源解释了如何将 AJAX 与 Django 一起使用。例如,
- https://www.pluralsight.com/guides/work-with-ajax-django
- https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html
- https://realpython.com/django-and-ajax-form-submissions/
另请参阅详细的 Django documentation,了解如何在 AJAX 请求中包含 CSRF 令牌。
您必须做出的一个决定是是否要使用表单发送数据。如果您在没有表单的情况下发送数据,请确保正确处理验证。使用表单发送数据的优点是 Django 负责表单验证、清理等。
如果您想使用表单,您可以在 html 中包含带有隐藏字段的表单,并在设置标记时用 JS 填充这些字段。您可能需要一个动态的 formset, since the number of markers is not fixed. Then you can use FormData 来序列化表单字段并将序列化的数据发送到您的 Django 后端,然后它可以以标准方式处理数据。
没有AJAX
在这种情况下,您执行与上述相同的操作(使用标记数据填充隐藏字段),但不是通过 AJAX 提交请求,例如一个标准的提交按钮。
我想用 django 创建一个网络应用程序,用户可以在其中在地图上创建标记。 我有这个 js 脚本,可以通过单击传单地图来添加标记。
window.onload = function () {
element = document.getElementById('osm-map');
var markers_list = new Array()
var map = L.map(element);
let rm = false
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// var markers = L.featureGroup([])
var target = L.latLng('48.8686034651125', '2.34261607443957');
map.setView(target, 5);
map.on('click', function (e) {
var node = document.createElement("LI")
var marker = new L.marker(e.latlng).addTo(map);
markers_list.push(marker);
var marker_id = marker._leaflet_id
let title_marker = window.prompt("give a name to your marker",marker_id);
//todo make sure input is not empty
while (!title_marker){
title_marker = window.prompt("give a non empty name",marker_id);
}
marker.bindPopup("marker's info: "+title_marker).openPopup()
map.addLayer(marker)
a = document.createElement('a')
a.innerHTML=title_marker
a.setAttribute('id', marker_id)
a.setAttribute('href',"javascript:void(0);");
node.appendChild(a);
document.getElementById("marker-list").appendChild(node)
}
);
rm_btn.onclick = function () { // function to enable edit of marker
rm = !rm
if (rm) {
document.getElementById('rm_btn').innerHTML = "Edition enabled";
}
else {
document.getElementById('rm_btn').innerHTML = "Edition disabled";
}
}
var ul = document.getElementById('marker-list'); //list of li marker
ul.onclick = function(e) {
if (rm) {
id_to_rem = e.target.id
for(var i=0;i<markers_list.length;i++){// iterate over layer to remove marker from map
if (markers_list[i]._leaflet_id == id_to_rem){
map.removeLayer(markers_list[i])
}
}
var a_list = ul.getElementsByTagName('a')
for(var i=0;i<a_list.length;i++){// iterate over ul to remove marker from li
if (a_list[i].id == id_to_rem){
ul.removeChild(ul.childNodes[i+1])
}
}
};
}
}
标记保存在标记列表数组中。如何将这些标记保存在 django 模型中。我必须在 html 模板中放置一个脚本标签然后做一些 django 的事情还是有其他解决方案?
谢谢
你的问题很宽泛。因此,我不会为所需的所有不同部分(模型、视图、url、模板、js 脚本)编写代码,而是提供一个大纲,您可以使用它来进一步缩小问题范围。
根据您的应用程序逻辑和偏好,您的数据应使用 AJAX 或作为表单提交提交。如果您需要在没有“页面刷新”的情况下提交数据,请使用 AJAX。如果用户没有最终提交操作,那么AJAX从用户体验的角度来说肯定会更好。
AJAX
有许多在线资源解释了如何将 AJAX 与 Django 一起使用。例如,
- https://www.pluralsight.com/guides/work-with-ajax-django
- https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html
- https://realpython.com/django-and-ajax-form-submissions/
另请参阅详细的 Django documentation,了解如何在 AJAX 请求中包含 CSRF 令牌。
您必须做出的一个决定是是否要使用表单发送数据。如果您在没有表单的情况下发送数据,请确保正确处理验证。使用表单发送数据的优点是 Django 负责表单验证、清理等。
如果您想使用表单,您可以在 html 中包含带有隐藏字段的表单,并在设置标记时用 JS 填充这些字段。您可能需要一个动态的 formset, since the number of markers is not fixed. Then you can use FormData 来序列化表单字段并将序列化的数据发送到您的 Django 后端,然后它可以以标准方式处理数据。
没有AJAX
在这种情况下,您执行与上述相同的操作(使用标记数据填充隐藏字段),但不是通过 AJAX 提交请求,例如一个标准的提交按钮。