Django:访问包含标签内的MEDIA_URL?

时间:2011-04-30 14:55:52

标签: django

Django的新手在我的方法论中可能完全错误。

我有一块复杂的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/,我不希望../到处都是。

感谢, 马特

2 个答案:

答案 0 :(得分: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}   

答案 1 :(得分:3)

您可以在模板标记中导入MEDIA_URL并将其传递给模板:

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

然后,您可以继续在模板中使用{{ MEDIA_URL }}