джангонавт.ru

direct_to_template вместо render_to_response

with 6 comments

Везде и всюду для загрузки и рендеринга шаблона для последующей отдачи браузеру рекомендуется использовать функцию render_to_response. Однако, если её использовать правильно, а не так, как написано в туториале, то помимо самой функции приходится импортировать еще и RequestContext, и явно передавать его:

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

def my_view(request):
    return render_to_response('my_template.html',
                              {'object_list': SomeModel.objects.all()},
                              context_instance=RequestContext(request))

То есть по факту получается, что это не такой уж и shortcut. Такой многословный код приводит к тому, что многие программисты делают собственные версии render_to_response, которые одним из параметров принимают request. А особо продвинутые джангонавты даже мудрят с декораторами.

Однако в django уже есть функция, которая фактически делает то же самое. Смотрите сами:

from django.views.generic.simple import direct_to_template

def my_view(request):
    return direct_to_template(request, 'my_template.html',
                              {'object_list': SomeModel.objects.all()})

Все generic views правильно работают с RequestContext и direct_to_template тут не исключение.

Written by finn

Август 23rd, 2009 at 12:01 дп

6 Responses to 'direct_to_template вместо render_to_response'

Subscribe to comments with RSS or TrackBack to 'direct_to_template вместо render_to_response'.

  1. Это круто, я этого как-то не заметил. :-)
    Все время использовал собственную версию.

    Andrew

    31 Авг 09 at 11:54

  2. А если итак:

    render_to_response(’my_template.html’, RequestContext(request, {’object_list’: SomeModel.objects.all()})

    uptimebox

    1 Сен 09 at 8:03

  3. А что не так, если использовать render_to_response так как написано в туториале?

    Gerlion

    1 Сен 09 at 8:51

  4. 2uptimebox: Так все равно надо импортировать RequestContext.

    Ну и работать оно будет по счастливой случайности - RequestContext прикидывается словарем. По-хорошему надо бы писать так:

    render_to_response(’my_template.html’, {},
                       RequestContext(request,
                                      {’object_list’: SomeModel.objects.all()}))

    Или, что то же самое, но логичнее:

    render_to_response(’my_template.html’,
                        {’object_list’: SomeModel.objects.all()},
                       RequestContext(request))

    А этот вариант фактически тот же самый, что в исходном посте, разве что RequestContext передается не через именованный параметр.

    finn

    1 Сен 09 at 9:05

  5. 2Gerlion: в туториале render_to_response() зовется только с двумя параметрами: именем шаблона и словарем с данными. Третий, необязательный параметр, не показан. При таком раскладе в шаблоне будут недоступны данные, которые подставляют context processors. Примечание по этому поводу есть прямо в доке на RequestContext

    finn

    1 Сен 09 at 15:43

  6. [...] 03.11.2011 0 0 Semirook, @render_to из django-annoying - тоже не совсем хорошо, потому как меняется тип возвращаемой информации. Уж лучше использовать direct_to_template - http://djangonaut.ru/2009/08/23/direct_to_template-instead-of-render_to_response/ [...]

Leave a Reply