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/,我不希望../
到处都是。
感谢, 马特
答案 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 }}
。