【问题标题】:Django include template tag multiple template choicesDjango包含模板标签多个模板选择
【发布时间】:2017-01-05 17:21:06
【问题描述】:

我有一个要求,我必须在模板标签中包含一个模板。但是我要包含的模板不固定。我有模板列表,首先找到的模板需要包含在内。

但是,包含模板标签只需要一个模板名称。 有没有办法修改这种行为或任何其他方式来实现这一点。

我也使用了自定义模板标签,但是自从更新到 django 1.9 后我收到了警告

RemovedInDjango110Warning: render() must be called with a dict, not a RequestContext.
return t.render(context)

这是我的自定义模板标签

@register.simple_tag(takes_context=True)
def custom_include(context, *template_choices):
    template_choices = (context['optionalTemplate'],) + template_choices
    t = template.loader.select_template(template_choices)
    return t.render(context)

我尝试从上下文中获取 dict,它似乎有效(至少我是这么认为的)。但是一些上下文数据丢失了。例如,我的谷歌分析点击量为零,诸如此类。

request = context['request']
mydict = context.dicts[0]
return t.render(mydict, request)

任何人都可以建议如何实现这一点。

【问题讨论】:

  • 你有没有尝试在上下文中创建一个 dict ? return t.render(dict(context))。我不确定它是否有效。如果 RequestContext 是一个对象,您可以检查它是否包含您感兴趣的带有变量的 dict。类似于 context.some_dict_name
  • 我也试过了,它似乎有效(至少我是这么认为的)。但是一些上下文数据丢失了。例如,我的谷歌分析点击量为零,诸如此类。查看我对问题的更新
  • 可能是t.render_to_string(context_instance=request_context)?在 Django 1.10 发行说明中还提到:“由 get_template() 和 select_template() 返回的 Django 模板对象在它们的 render() 方法中不再接受 Context。” docs.djangoproject.com/en/1.10/releases/1.10 我没有进一步寻找相关票证。但是这个原因应该存在于跟踪器中。 code.djangoproject.com

标签: django django-templates templatetags


【解决方案1】:

您需要将上下文扁平化为单个字典。这将合并来自所有内部字典的数据:

mydict = context.flatten()
return t.render(mydict, context.request)

同时检查the docs

【讨论】:

  • 嘿,谢谢,它正在工作。我只需要监控谷歌分析几个小时来验证这一点