一段时间以来,我一直在研究 Django 样板。 Django 有(至少)三个非常相似的模板渲染函数,每个函数都有不同程度的快捷方式:
django.shortcuts.render_to_response
django.template.loader.render_to_string
django.views.generic.simple.direct_to_template
似乎其中至少两个(可能是 render_to_response 和 direct_to_template)可以重构为一个单一的、不那么样板的快捷方式。
django.views.generic.simple.direct_to_template 本身就足够好,但不幸的是,将关键字参数放在 params 字典中,使其与 render_to_response 的大多数用途不兼容(从 render_to_response 切换到 @ 时,通常需要模板重构987654326@)。 render_to_response,讽刺地生活在 django.shortcuts 中,几乎不是一个经过深思熟虑的捷径。它应该将关键字参数转换为模板参数,而且那个笨拙的 context_instance 参数太长了,不能经常输入。
我尝试了一个更有用的快捷方式。请注意使用*request_and_template_and_params 以防止模板参数名称和位置参数名称之间发生冲突。
def render(*request_and_template_and_params, **kwargs):
"""Shortcut for rendering a template with RequestContext
Takes two or three positional arguments: request, template_name, and
optionally a mapping of template parameters. All keyword arguments,
with the excepiton of 'mimetype' are added to the request context.
Returns a HttpResponse object.
"""
if len(request_and_template_and_params) == 2:
request, template_name = request_and_template_and_params
params = kwargs
else:
request, template_name, params = request_and_template_and_params
params = dict(params) # copy because we mutate it
params.update(kwargs)
httpresponse_kwargs = {'mimetype': params.pop('mimetype', None)}
context = RequestContext(request, params)
return HttpResponse(loader.render_to_string(
template_name, context_instance=context), **httpresponse_kwargs)