2012-07-20 21 views
3

我想找到使用django的模板上下文加載器顯示圖像的最有效方法。我的應用程序中有一個靜態目錄,其中包含圖像'victoryDance.gif'和一個空的靜態根目錄(項目級別爲settings.py)。假設我的urls.pysettings.py文件中的路徑是正確的。什麼是最好的看法?一個簡單的視圖來顯示/渲染Django中的靜態圖像

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))) 

感謝您的回答這些視圖都可以工作!

回答

10

如果您需要渲染的圖像讀取這裏有點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") 

也有做事的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', 
) 
+0

用'content_type'替換'mimetype'從django 1.5 – 2015-06-13 02:29:15

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模板標籤。

3

在您的最後一個例子(圖像5),你應該使用{{ STATIC_PREFIX }}代替{% STATIC_PREFIX %}

STATIC_PREFIX是可變的,而不是標籤

+0

當你看到它時它總是那麼簡單!謝謝! – JoshuaBox 2012-07-21 07:41:29