【问题标题】:Error when trying to render Folium map on Django Server尝试在 Django 服务器上渲染 Folium 地图时出错
【发布时间】:2019-08-12 07:08:59
【问题描述】:

view.py

map = folium.Map(location=[df['latitude'].mean(), 
df['longitude'].mean()],tiles="cartodbpositron",zoom_start=12)

map.save("map.html")

context = {'my_map': map}

return render(request, 'my_map.html', context)

my_map.html:

<!DOCTYPE html>
<html lang="en">
<head>
     <meta charset="UTF-8">
     <title>Title</title>
</head>
<body>
{{ my_map }}
</body>

浏览器结果:

folium.folium.Map object at 0x7f49d85662b0

在用户通过之前的 html 表单提交输入后,我不确定如何让 html/js 在浏览器上运行... 我似乎到处寻找,解决方案有很多类似的问题,但我无法解决任何问题!

谢谢!

【问题讨论】:

  • 很遗憾,我没有足够的代表来发布普通图片!
  • 你根本不应该发布代码图片!
  • #virtualmachinethings
  • 这样更好。现在发布更多视图,以便我们可以看到map 是什么。
  • 我已经更新了地图是什么的一些上下文。如果我只是简单地运行 html 文件,则 Map 可以正常工作,但是当它在 django 服务器的上下文中并被解析以呈现时,它会遇到一些问题。

标签: python django dictionary render folium


【解决方案1】:

此回复旨在为像我一样在尝试在 Django 模板中渲染 Folium 地图时也遇到此问题的其他人增加 google 覆盖率。

您的代码

请查看每个代码块中的 cmets,了解如何按预期渲染地图。

views.py

​​>
map = folium.Map(location=[df['latitude'].mean(), 
df['longitude'].mean()],tiles="cartodbpositron",zoom_start=12)

map.save("map.html")

# {'my_map': map} will output the object, which is what you are seeing
# to rectify this we need to turn it into an iframe which 
# the template can then render.
context = {'my_map': map} # change to {'my_map': map._repr_html_()}

return render(request, 'my_map.html', context)

模板

<!DOCTYPE html>
<html lang="en">
<head>
     <meta charset="UTF-8">
     <title>Title</title>
</head>
<body>
# after making the change in our views.py this will return the html but
# the template will not render it as expected because it is being escaped.
# You must declare it 'safe' before it will be rendered correctly.
{{ my_map }} # change to {{ my_map | safe }}
</body>

有关更多信息,请参阅 Folium 文档页面 herethis SO 帖子。

希望对您有所帮助。

【讨论】:

  • 您好,您的回答很好,但我可以看到一个问题。在我的项目中,我从 Postgres 获取数据,并添加集群、弹出窗口。如果查询很大,地图呈现 2-3 秒,在等待地图时,我可以在地图位置看到一条消息:“使此笔记本受信任以加载地图:文件 - > 信任笔记本”。有谁知道为什么会这样?
【解决方案2】:

Map 对象有一个渲染 method 来渲染它的 html 表示。

你可以直接试试:

<body>
{{ my_map.render }}
</body>

或者您可以使用Map.render 方法来实现自定义包含标记,这样您就可以将参数传递给render 方法。阅读更多关于inclusion and custom tags的信息。

# The template tag.
for django.template import Library

register = Library()

@register.inclusion_tag
def render_map(map_object, **kwargs):
    return map_object.render(**kwargs)

在您的模板中:

<body>
{% render_map my_map some_arg1=arg1  some_arg2=arg2 %}
</body>

【讨论】:

  • 您好,感谢您的回复!我尝试了直接的方法,而不是打印folium map 对象,它现在在页面上打印“无”!感谢您提供有关包含和自定义标签的信息:)
  • 好吧,如果它打印出None,那就是地图对象的问题(另一个问题)。我很乐意提供帮助。
猜你喜欢
  • 2019-06-09
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2022-10-03
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多