direct_to_template вместо render_to_response
Везде и всюду для загрузки и рендеринга шаблона для последующей отдачи браузеру рекомендуется использовать функцию 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 тут не исключение.
Это круто, я этого как-то не заметил.
Все время использовал собственную версию.
Andrew
31 Авг 09 at 11:54
А если итак:
render_to_response(’my_template.html’, RequestContext(request, {’object_list’: SomeModel.objects.all()})
uptimebox
1 Сен 09 at 8:03
А что не так, если использовать render_to_response так как написано в туториале?
Gerlion
1 Сен 09 at 8:51
2uptimebox: Так все равно надо импортировать RequestContext.
Ну и работать оно будет по счастливой случайности - RequestContext прикидывается словарем. По-хорошему надо бы писать так:
Или, что то же самое, но логичнее:
А этот вариант фактически тот же самый, что в исходном посте, разве что RequestContext передается не через именованный параметр.
finn
1 Сен 09 at 9:05
2Gerlion: в туториале render_to_response() зовется только с двумя параметрами: именем шаблона и словарем с данными. Третий, необязательный параметр, не показан. При таком раскладе в шаблоне будут недоступны данные, которые подставляют context processors. Примечание по этому поводу есть прямо в доке на RequestContext
finn
1 Сен 09 at 15:43
[...] 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/ [...]
Как передать параметр?
3 Ноя 11 at 18:18