2

要するに問題:

画像を作成する関数に任意の長い座標リストなどの引数が必要な場合、テンプレートに動的画像を表示するにはどうすればよいですか。

たとえば<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('_')]

それはうまくいき、今のところ満足していますが、これが最適な解決策ではないかもしれないと私は悪い感じがします

4

1 に答える 1

1

あなたのurls.py形が間違っているようです。

URL を介して変数を渡すことができます。正しい構文 (正規表現としての変数) を使用することで、やろうとしているurl()ときにこれらの変数を参照できます。{% url %}

この簡単な例は、 http ://www.djangobook.com/en/2.0/chapter08.html#using-default-view-arguments からのものです。

urls.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 に答える