9

django のテンプレート コンテキスト ローダーを使用して画像を表示する最も効率的な方法を見つけようとしています。アプリ内に、画像「victoryDance.gif」を含む静的ディレクトリと、プロジェクト レベルの空の静的ルート ディレクトリ ( を使用settings.py) があります。urls.pymyおよびfiles内のパスsettings.pyが正しいと仮定します。最高の景色は何ですか?

from django.shortcuts import HttpResponse
from django.conf import settings
from django.template import RequestContext, Template, Context

def image1(request): #  good because only the required context is rendered
    html = Template('<img src="{{ STATIC_URL }}victoryDance.gif" alt="Hi!" />')
    ctx = { 'STATIC_URL':settings.STATIC_URL}
    return HttpResponse(html.render(Context(ctx)))

def image2(request): # good because you don't have to explicitly define STATIC_URL
    html = Template('<img src="{{ STATIC_URL }}victoryDance.gif" alt="Hi!" />')
    return HttpResponse(html.render(RequestContext(request)))

def image3(request): # This allows you to load STATIC_URL selectively from the template end
    html = Template('{% load static %}<img src="{% static "victoryDance.gif" %}" />')
    return HttpResponse(html.render(Context(request)))

def image4(request): # same pros as image3
    html = Template('{% load static %} <img src="{% get_static_prefix %}victoryDance.gif" %}" />')
    return HttpResponse(html.render(Context(request)))

def image5(request):
    html = Template('{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img  src="{{ STATIC_PREFIX }}victoryDance.gif" alt="Hi!" />')
    return HttpResponse(html.render(Context(request)))

回答ありがとうございます これらのビューはすべて機能します!

4

3 に答える 3

26

画像をレンダリングする必要がある場合は、http://www.djangobook.com/en/1.0/chapter11/を少し読んで、次のコードのバージョンを使用してください。

django バージョン <= 1.5 の場合:

from django.http import HttpResponse

def my_image(request):
    image_data = open("/path/to/my/image.png", "rb").read()
    return HttpResponse(image_data, mimetype="image/png")

django 1.5+ の場合、次のようmimetypeに置き換えられましたcontent_type(もう django を使用していないことをうれしく思います):

from django.http import HttpResponse

def my_image(request):
    image_data = open("/path/to/my/image.png", "rb").read()
    return HttpResponse(image_data, content_type="image/png")

また、物事を行うためのより良い方法があります!

効率的なテンプレート エンジンが必要な場合は、Jinja2 を使用してください。

それ以外の場合、Django のテンプレート システムを使用している場合、私の知る限り、「静的」コンテキスト プリプロセッサによってテンプレートに提供されるため、STATIC_URL を定義する必要はありません。

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.static',
    'django.core.context_processors.media',
    'django.core.context_processors.request',
    'django.contrib.messages.context_processors.messages',
)
于 2012-07-20T10:56:57.997 に答える
3

最後の例 ( image5{{ STATIC_PREFIX }} )では、代わりに使用する必要があります{% STATIC_PREFIX %}

STATIC_PREFIXタグではなく変数です

于 2012-07-20T14:50:59.160 に答える
0

STATIC_URL明示的に定義することを避けるためにRequestContext、テンプレートをレンダリングするときに a を使用できます。が設定されていることを確認django.core.context_processors.staticしてください TEMPLATE_CONTEXT_PROCESSORS

from django.template import RequestContext
...
return HttpResponse(html.render(RequestContext(request, ctx)))

または、静的テンプレート タグを使用することもできます。

html = Template('<img src="{% static "victoryDance.gif" %} alt="Hi!" />')

3 番目のオプションはget_static_prefixテンプレート タグです。

于 2012-07-20T10:41:59.277 に答える