solovyov.net

Django render_to_response

Есть в Django одна очень часто используемая мной функция - шорткат render_to_response. По сути, её параметрами является имя темплейта и словарь передаваемых в него переменных. И вот переменные можно передать двумя путями. Либо явно указать его здесь в словаре, либо заставив рендерер использовать в качестве обработчика контекста класс django.template.RequestContext и в переменной TEMPLATE_CONTEXT_PROCESSORS в settings указав необходимые функции. Все переменные, которые вернут эти функции, будут видны в любом темплейте, который отрисовывается с помощью RequestContext‘а.

И вот тут начинается куча лишнего кода. Потому что каждый вызов render_to_response начинает выглядеть так:

return render_to_response('cool/template.html',
                          {'people': people, 'things': things},
                          context_instance=RequestContext(request))

Меня реально очень раздражала необходимость писать каждый раз этот самый context_instance. И сегодня придумался декоратор, который делает всю нудную работу. :]

from django.shortcuts import render_to_response
from django.template import RequestContext

def render_to(tmpl):
    def renderer(func):
        def wrapper(request, *args, **kw):
            output = func(request, *args, **kw)
            if not isinstance(output, dict):
                return output
            return render_to_response(tmpl, output,
                                      context_instance=RequestContext(request))
        return wrapper
    return renderer

Теперь отрисовывать всё можно с помощью декоратора:

@render_to('cool/template.html')
def view(request):
    return {'people': people, 'things': things}

Если функция вернёт словарь - render_to обернёт его в render_to_response и отпустит на волю, а если что-то другое (к примеру, HttpResponse - перенаправление какое-нибудь) - то просто отпустит на волю. :] Для меня это оказалось очень удобным решением.

P.S. Ну и как водится, через минут 10 после всего я обнаружил, что в принципе изобрёл велосипед - вот тут уже есть подобный декоратор. Хотя мой велосипед просто проще. ;)