我正在尝试使用django的模板上下文加载器找到显示图像的最有效方法。我的应用程序中有一个静态目录,其中包含图像'victoryDance.gif'和项目级别的空静态根目录(带settings.py
)。假设我的urls.py
和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)))
感谢您的回答这些观点都有效!
答案 0 :(得分:15)
如果您需要在此处http://www.djangobook.com/en/1.0/chapter11/渲染图像并使用以下代码的版本:
对于django版本&lt; = 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")
还有a better way做事!
否则,如果您需要高效的模板引擎,请使用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',
)
答案 1 :(得分:3)
在上一个示例( image5 )中,您应该使用{{ STATIC_PREFIX }}
代替{% STATIC_PREFIX %}
STATIC_PREFIX
是可变的,而不是标记
答案 2 :(得分:0)
为避免明确定义STATIC_URL
,您可以在渲染模板时使用RequestContext
。只需确保django.core.context_processors.static
设置为TEMPLATE_CONTEXT_PROCESSORS
。
from django.template import RequestContext
...
return HttpResponse(html.render(RequestContext(request, ctx)))
或者,您可以使用static template tag。
html = Template('<img src="{% static "victoryDance.gif" %} alt="Hi!" />')
第三个选项是get_static_prefix
模板标记。