简而言之问题:
当创建图像的函数需要参数时,如何在模板上显示动态图像,例如任意长的坐标列表..?
例如<img src="{% url getComplexImg coords %}"/>
,其中 coords 是由整数或整数元组组成的任意长度的列表,getComplexImg 是一个视图,它以 HttpResponse 的形式返回图像,其中 mimetype 是 image/png,并且图像是使用坐标列表生成的。
编辑:我在底部添加了一个解决方案(受第一个答案的启发)。
问题,长版本
以下是我正在尝试做的事情的简化
网址.py:
urlpatterns = patterns('',
url(r'^getSimpleImg$', views.getSimpleImg, name='getSimpleImg'),
url(r'^getComplexImg$', views.getComplexImg, name='getComplexImg'),
url(r'^showAllImgs$', views.showAllImgs, name='showAllImgs')
)
视图.py:
...
from django.template import Context, loader
...
def getSimpleImg(request):
return HttpResponse(getImg.simple(), mimetype="image/png")
def getComplexImg(request, coords_1, coords_2):
return HttpResponse(getImg.complex(coords_1,coords_2), mimetype="image/png")
def showAllImgs(request):
coords_1, coords_2 = data_module.get_all_coordinates()
context = Context({
'coords_1':coords_1,
'coords_2':coords_2})
template = loader.get_template('showall.html')
return HttpResponse(template.render(context))
'data_module.get_all_coordinates()' 只是一个返回两个任意长度列表的方法(这些列表可以包含整数或整数元组)。
showall.html:
<html>
...
<img src="{% url getSimpleImg %}"/>
<img src="{% url getComplexImg coords_1 coords_2 %}"/>
...
</html>
让 Django 显示从“getSimpleImg”返回的图像非常容易,因为它不需要任何列表参数。但是我正在努力让 Django 显示复杂的图像,因为我不知道如何将任意列表作为模板的参数传递。
上面的代码显然不起作用,因为 Django 无法在 urls.py 中查找 '{% url getComplexImg coords_1 coords_2 %}'。
这种问题应该如何解决?
例如,我应该以某种方式发送带有上下文的图像吗?像:
视图.py:
...
def showAllImgs(request):
coords_1, coords_2 = data_module.get_all_coordinates()
context = Context({
'img_1':getImg.simple(),
'img_2':getImg.complex(coords_1,coords_2)})
template = loader.get_template('showall.html')
return HttpResponse(template.render(context))
showall.html:
<html>
...
<img src="{{ img_1 }}"/>
<img src="{{ img_2 }}"/>
...
</html>
(以上不起作用,只是为了说明我的意思)
或者我应该以某种方式将我需要的所有东西导入模板,然后从那里创建和显示图像..?像:
showall.html:
{% import data_module %}
{% import getImg %}
<html>
...
<img src="{% getImg.simple() %}"/>
<img src="{% getImg.complex(data_module.get_all_coordinates()) %}"/>
...
</html>
解决方案,灵感来自第一个答案
我现在通过将上下文传递为来解决它:
Context({'coords_1':"_".join([str(v) for v in coords_1])})
并在 urls.py 中捕获 url:
url(r'^getComplexImg/(?P<coords_1>[0-9_\-]+)/$', views.getComplexImg, name='getComplexImg')
在我的 getComplexImg 视图中,我将字符串列表转换回真实列表:
coords_1 = [int(v) for v in coords_1.split('_')]
它有效,我现在很满意,但我有一种不好的感觉,这可能不是最佳解决方案