2011-04-30 71 views
1

Django的新手在我的方法中可能完全错误。Django:在inclusion_tag中访问MEDIA_URL?

我有一块复杂的HTML,可以在我的网站的多个部分中重复使用,但会填充不同的数据。我想把它变成我可以放在任何地方的街区。

我就包含标签阅读并这样定义它:

from django import template 
register = template.Library() 

@register.inclusion_tag('release_widget.html') 
def release_widget(releases): 
    return {'release_list': releases} 

然后当我在模板中使用它:

{% load release_widget %} 
{% release_widget release_list %} 

这工作。我的问题是,在release_widget.html文件中,我无法访问我的MEDIA_URL变量,该变量定义在哪里查找我的图像资产。我认为这是因为上下文没有被传递?

我看着takes_context=True参数,但无法弄清楚 - 看起来这不再需要变量,这对我不起作用 - 我需要每次都能够传递不同的字典我包括该块。

有没有更好的方法来做到这一点?我甚至应该使用MEDIA_URL?我不能只使用绝对路径,因为我的网站结构像site.com/article/something/123,资产位于site.com/assets/,我不想在任何地方都使用../

感谢, 马特

回答

12

takes_context是正确的路要走。我不知道你为什么说它没有使用变量:它的确如此,它只是将上下文字典作为附加(初始)参数。所以标签看起来是这样的:

@register.inclusion_tag('release_widget.html', takes_context=True) 
def release_widget(context, releases): 
    return {'MEDIA_URL': context['MEDIA_URL'], 'release_list': releases} 
+0

谢谢,我猜fet_context的文档混淆了我。这很好。 – 2011-04-30 16:15:26

3

你可以在你的模板标签导入MEDIA_URL并把它传递到您的模板:

def release_widget(releases): 
    from django.conf import settings 
    return {'release_list': releases, 
      'MEDIA_URL': settings.MEDIA_URL} 

然后你就可以继续在模板中使用{{ MEDIA_URL }}