在自定义templatetag中搜索上下文

时间:2018-04-03 14:23:44

标签: django templatetags

我目前正在使用自定义templatetags来减少模板代码。我基本上是将视图中的上下文传递给标记,然后将其呈现为共享模板。然而,我遇到了一个我无法解决的问题。

我传递给标记的视图的上下文都包含一个以'_collection'结尾的键。本质上,我需要浏览上下文并找到与该子字符串对应的键/值对,然后将其映射到标记上下文。

以下是我正在使用的模板标签:

from django import template

register = template.Library()


@register.inclusion_tag('main/collection.html', takes_context=True)
def collection(context):
    ctx = {
        'is_create': context['is_create']
    }

    if '_collection' in context:
        # not sure how to get this into the context

    return ctx

基本上我只想通过使用该子字符串将该值正确映射到templatetag上下文。

非常感谢任何帮助。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您只需要通过仅使用某些键(以"_context"结尾的那些键)来创建上下文的映射。

ctx = {
    key.split("_collection")[0]: value
    for key, value in context.flatten().items()
    if key.endswith("_collection")
}

这应该足够了。请注意key上的拆分。它会将foo_collection更改为foo。如果不需要,您可以直接使用密钥,而不需要拆分。

在上下文中调用flatten()应该返回一个组合来自所有源(视图和所有上下文预处理器)的上下文数据的dict。由于我们现在有一个字典,我们可以毫无问题地迭代它的项目。

然后,您可以添加要添加的任何特定键

ctx['is_create'] = context['is_create']

或者,如果您不想调用flatten,您可以迭代上下文并执行类似

的操作
ctx = {
    'is_create': context['is_create']
}
for key in context:
   if key.endswith("_collection"):
       ctx[key.split("_collection")[0]] = context[key]