我目前正在使用自定义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上下文。
非常感谢任何帮助。
感谢您的时间。
答案 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]