2

简而言之问题:

当创建图像的函数需要参数时,如何在模板上显示动态图像,例如任意长的坐标列表..?

例如<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('_')]

它有效,我现在很满意,但我有一种不好的感觉,这可能不是最佳解决方案

4

1 回答 1

1

看起来你urls.py的格式不正确。

您可以通过您的网址传递变量。url()通过使用正确的语法(变量作为正则表达式),您可以在调用or时引用这些变量{% url %},就像您尝试做的那样。

这个简单的例子来自这里: http: //www.djangobook.com/en/2.0/chapter08.html#using-default-view-arguments

网址.py

urlpatterns = patterns('',
    (r'^blog/$', views.page),
    (r'^blog/page(?P<num>\d+)/$', views.page),
)

视图.py

def page(request, num='1'):
    # Output the appropriate page of blog entries, according to num.
    # ...

这里重要的是:(?P<num>\d+)

然后,您可以将任何内容传递<here>给您的视图函数,例如:def my_view(request, here): ...

在您的情况下,您将替换以下内容:

url(r'^getSimpleImg$', views.getSimpleImg, name='getSimpleImg'),
...

对于这样的事情:

url(r'^getSimpleImg/(?P<coord1>\d+)/(?P<coord2>\d+)/$', views.getSimpleImg, name='getSimpleImg'),
...

你很多人不想在你的 url 中使用命名变量,但如果是这种情况,你不能使用{% url %}任何一个并且需要找到另一个解决方案。

于 2012-12-06T14:10:18.863 回答