Некоторое время я бился головой о шаблон Джанго. 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
на direct_to_template
). 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)