要するに問題:
画像を作成する関数に任意の長い座標リストなどの引数が必要な場合、テンプレートに動的画像を表示するにはどうすればよいですか。
たとえば<img src="{% url getComplexImg coords %}"/>
、coordsは整数または整数のタプルで構成される任意の長さのリストであり、getComplexImgは画像をHttpResponseとして返すビューであり、mimetypeはimage / pngであり、画像は座標のリストで生成されます。
編集:私は下部に解決策(最初の答えに触発された)を追加しました。
問題、長いバージョン
以下は私がやろうとしていることの単純化です
urls.py:
urlpatterns = patterns('',
url(r'^getSimpleImg$', views.getSimpleImg, name='getSimpleImg'),
url(r'^getComplexImg$', views.getComplexImg, name='getComplexImg'),
url(r'^showAllImgs$', views.showAllImgs, name='showAllImgs')
)
views.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()'は、任意の長さの2つのリストを返す単なるメソッドです(リストには整数または整数のタプルを含めることができます)。
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%}'を検索できないため、上記のコードは明らかに機能しません。
この種の問題はどのように解決する必要がありますか?
たとえば、コンテキストとともに画像を送信する必要がありますか?お気に入り:
views.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('_')]
それはうまくいき、今のところ満足していますが、これが最適な解決策ではないかもしれないと私は悪い感じがします