【问题标题】:How can I get a Django TemplateLoader see the current Context or Request?如何让 Django TemplateLoader 查看当前的上下文或请求?
【发布时间】:2010-05-15 19:28:12
【问题描述】:

我正在尝试构建一个 Django TemplateLoader,但我不能让它“看到”当前的上下文或请求,所以我真的不能用它做很多事情。

有谁知道如何让 Django TemplateLoader 做到这一点?

非常感谢

【问题讨论】:

  • 需要更多信息。为什么它需要访问请求或上下文?你想达到什么目的?
  • 我正在尝试实现一个 TemplateLoader,它可以动态决定是否从移动文件夹或任何地方加载模板。我知道有办法通过使用诸如制作 render_to_response 替代品之类的东西来完成这项工作,但我不想这样做,因为我希望能够在标准页面上包含模板的移动版本。希望这是有道理的:)

标签: django django-templates request


【解决方案1】:

决定模板的地方就在您的视野中。在那里,您可以访问请求,并且可以根据您喜欢的任何条件动态构建模板名称。例如,

def my_view(request, ...):
  ...
  template_name = 'template.html'
  if is_mobile(request): template_name = 'mobile_' + template_name
  template = get_template(template_name)
  context = RequestContext(request, {...})
  return HttpResponse(template.render(context))

您在哪里提供is_mobile()。最好提供一种方法,该方法接受请求和模板名称,并返回一个经过适当修改的方法(这样您就可以对该逻辑进行一次编码,而不是分散在多个视图中)。

您还可以从 select_template() 获得一些利用,它采用候选模板名称列表,返回找到的第一个模板。

【讨论】:

  • 是的,我目前有类似的东西作为替代 render_to_response(称为模板),但我如何将其应用于 django.contrib.auth.views.login 之类的东西,因为它们使用正确的 render_to_response
  • 您不需要直接从 urlpattern 调用 django.contrib.auth.views.login。您可以将其包装为另一个视图,该视图使用请求来确定要传递的模板名称。
  • 哦,好吧。我会考虑这样做的。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2013-03-15
  • 2021-02-03
  • 2018-08-17
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
相关资源
最近更新 更多