Django: TemplateResponse

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})

11 myśli nt. „Django: TemplateResponse

  1. Świetnie, jestem w połowie aplikacji i teraz muszę przepisać wszystkie widoki. Kiedy wypada render_to_response?

  2. 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.

  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.

  4. @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.

  5. 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ć.

  6. @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ć.

  7. @kr:

    Tak, już domyśliłem się, o którą funkcję chodziło. Jak pisałem wyżej, TemplateResponse jest renderowany leniwie i nawet po fakcie pozwala ustalić, jakie przekazano do niego parametry.

  8. Jeżeli coś wyleci to pewnie wyleci w Django 1.5 – podejrzewam, że to będzie przeróbka a`la sf1.4 -> Symfony 2

  9. 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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>