gpt4 book ai didi

django - 当创建图像的函数需要参数(如坐标列表)时,如何在模板上显示动态图像?

转载 作者:行者123 更新时间:2023-12-05 06:46:42 27 4
gpt4 key购买 nike

问题简而言之:

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

例如<img src="{% url getComplexImg coords %}"/> ,其中 coords 是由整数或整数元组组成的任意长度的列表,getComplexImg 是一个 View ,它将图像作为 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')
)

View .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 %}'。

这种问题应该怎么解决?

例如,我是否应该以某种方式发送带有上下文的图像?喜欢:

View .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 View 中,我将字符串列表转换回真实列表:

coords_1 = [int(v) for v in coords_1.split('_')]

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

最佳答案

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

您可以通过网址传递变量。通过使用正确的语法(变量作为正则表达式),您可以在调用 url() 时引用这些变量。或 {% 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),
)

View .py

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

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

然后您可以传递 <here> 中的任何内容到您的 View 函数,例如: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 %}两者都需要找到另一种解决方案。

关于django - 当创建图像的函数需要参数(如坐标列表)时,如何在模板上显示动态图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com