Przyszło Django 1.3, pojawiła się paskudna implementacja class-based views, direct_to_template zostało oznaczone jako przestarzałe. Ale pojawił się też godny następca, choć z class-based views nie ma nic wspólnego.
Nie piszemy więc tak:
from django.shortcuts import render_to_response
from django.template import RequestContext
def foo(request):
# ...
return render_to_response('foo.html', {'bar': baz},
context_instance=RequestContext(request))
Nie piszemy też tak:
from django.views.generic.simple import direct_to_template
def foo(request):
# ...
return direct_to_template(request, 'foo.html', {'bar': baz})
Ani — tym bardziej — tak:
from django.views.generic import TemplateView
def foo(request):
# ...
return TemplateView.as_view(template_name='foo.html')(request, bar=baz)
Drodzy państwo, zamiast powyższych używamy:
from django.template.response import TemplateResponse
def foo(request):
# ...
return TemplateResponse(request, 'foo.html', {'bar': baz})
Świetnie, jestem w połowie aplikacji i teraz muszę przepisać wszystkie widoki. Kiedy wypada render_to_response?
Wypaść pewnie nie wypadnie przed 1.4 czy 1.5, ale TemplateResponse jest marzeniem jeśli chodzi o debugowanie i testy jednostkowe. Możesz już po odebraniu wyniku z widoku sprawdzić, który szablon został użyty to jego wyrenderowania i co dostał w kontekście.
@opi, zobacz tutaj: http://docs.djangoproject.com/en/dev/releases/1.3/#deprecated-features-1-3
Dzięki Wam obu, czytałem tylko release notes od 1.3, nie czytałem deprecated. Nic, trzeba będzie zrobić zmiany póki nie jest tego za dużo.
@opi:
Teraz przeczytałem twój komentarz jeszcze raz. Nikt nie mówił, że wylecieć ma
render_to_response, chociaż to chyba najbardziej pracochłonna metoda osiągnięcia tego samego wyniku.A to przypadkiem nie miało być render jako zastępstwo?
Poza tym ja posiadam swój własny dekorator do funkcji, który wybiera template względem tego czy użytkownik pobierał zwykłą stronę czy AJAX (is_ajax z Django), a w funkcji zwracam tylko słownik z elementami, które mają się pojawić.
@zwierzak:
„Render jako zastępstwo”?
Ja wolę jawnie zwracać odpowiedzi zamiast dekorować widoki. Zysk niewielki (zyskujesz jedną-dwie linie kodu kosztem czytelności), a w razie wystąpienia wyjątku w szablonie dostajesz bardzo średnio pomocny zrzut stosu.
Nie zmienia to faktu, że w samym dekoratorze też musisz coś zawołać.
„Render jako zastępstwo”? render – http://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
@kr:
Tak, już domyśliłem się, o którą funkcję chodziło. Jak pisałem wyżej,
TemplateResponsejest renderowany leniwie i nawet po fakcie pozwala ustalić, jakie przekazano do niego parametry.Jeżeli coś wyleci to pewnie wyleci w Django 1.5 – podejrzewam, że to będzie przeróbka a`la sf1.4 -> Symfony 2
Dzięki za wpis. Proszę o więcej wpisów na temat Django. Może jakiś kurs dla początkujących (z innymi tematami niż oficjalny tutorial), mało tego w polskiej sieci.
Pozdrawiam