Renderowanie obiektów JSON przy użyciu szablonu Django po wywołaniu Ajax

Próbowałem zrozumieć, jaki jest optymalny sposób działania Ajax w Django . Czytając rzeczy tu i ówdzie doszedłem do wniosku, że wspólny proces to:

  1. Sformułuj swoje wywołanie Ajax używając jakiejś biblioteki JavaScript (np. jQuery), Skonfiguruj wzorzec URL w Django, który przechwyci wywołanie i przekaże je do funkcji widoku

  2. W funkcji widoku Python Odzyskaj obiekty, które Cię interesują i odeślij je z powrotem do Klienta w formacie JSON lub podobnym (za pomocą wbudowanego modułu serializera lub simplejson)

  3. Zdefiniuj funkcję zwrotną w JavaScript, która odbiera dane JSON i przetwarza je, tak aby utworzyć dowolny HTML jest potrzebny do wyświetlenia. Wreszcie, skrypt JavaScript umieszcza HTML tam, gdzie powinien się zatrzymać.

Nadal nie rozumiem Jak są powiązane Szablony Django z tym wszystkim? najwyraźniej nie korzystamy z moc szablonów w ogóle. Idealnie, pomyślałem, że byłoby miło przekazać obiekt JSON i nazwę szablonu, tak, że dane mogą być iterowane i blok HTML jest tworzony. Ale może się mylę...

Jedynym zasobem, który znalazłem, który idzie w tym kierunku jest ten fragment (769) ale jeszcze nie próbowałem. Oczywiście, co się stanie w tym przypadku jest to, że cały wynikowy HTML jest tworzony po stronie serwera, a następnie przekazywany klientowi. Na JavaScript - funkcja callback musi tylko wyświetlić go w odpowiednim miejscu.

Czy to powoduje problemy z wydajnością? Jeśli nie, nawet bez użycia powyższego fragmentu, dlaczego nie sformatować HTML bezpośrednio w backendzie za pomocą Pythona zamiast front-endu?

Wielkie dzięki!

Aktualizacja: Proszę użyć snippet 942 ponieważ jest to ulepszona wersja tego powyżej! odkryłem, że wsparcie spadku działa znacznie lepiej w ten sposób..

Author: Peter Mortensen, 2009-05-19

8 answers

Hej dzięki vikingosegundo!

Ja też lubię używać dekoratorów: -). Ale w międzyczasie podążałem za podejściem sugerowanym przez fragment, o którym wspomniałem powyżej. Jedyna rzecz, użyj zamiast fragmentu N. 942 ponieważ jest to ulepszona wersja oryginału. Oto jak to działa:

Wyobraź sobie, że masz szablon (np. ' subtemplate.html') dowolnego rozmiaru, który zawiera użyteczny blok, możesz użyć ponownie:

     ........
    <div id="results">          
        {% block results %}
            {% for el in items %}
                   <li>{{el|capfirst}}</li>
            {% endfor %}
        {% endblock %}      
    </div><br />
     ........

Poprzez zaimportowanie do pliku widoku fragmentu powyżej możesz łatwo odwołać się do dowolnego bloku w szablonach. Fajną cechą jest to, że relacje dziedziczenia między szablonami są brane pod uwagę, więc jeśli odwołujesz się do bloku, który zawiera inny blok i tak dalej, wszystko powinno działać dobrze. Tak więc ajax-view wygląda tak:

from django.template import loader
# downloaded from djangosnippets.com[942]
from my_project.snippets.template import render_block_to_string

def ajax_view(request):
    # some random context
    context = Context({'items': range(100)})
    # passing the template_name + block_name + context
    return_str = render_block_to_string('standard/subtemplate.html', 'results', context)
    return HttpResponse(return_str)
 25
Author: magicrebirth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-19 18:29:24

Oto jak używam tego samego szablonu do tradycyjnego renderowania i renderowania Ajax-response.

Szablon:

<div  id="sortable">

{% include "admin/app/model/subtemplate.html" %}
</div>

Dołączony szablon (aka: subtemplate):

<div id="results_listing">
{% if results %}
    {% for c in results %}
        .....
    {% endfor %}
{% else %}

Ajax-view:

@login_required
@render_to('admin/app/model/subtemplate.html')#annoying-decorator
def ajax_view(request):
    .....

    return { 
        "results":Model.objects.all(),
    }      

Oczywiście możesz użyć render_to_response. Ale lubię tych denerwujących dekoratorów: d

 13
Author: vikingosegundo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-11 12:55:09

Nie ma powodu, dla którego nie możesz zwrócić wyrenderowanego bitu HTML za pomocą Ajax i wstawić go do istniejącej strony w miejscu, w którym chcesz. Oczywiście możesz użyć szablonów Django do renderowania tego HTML, jeśli chcesz.

 7
Author: Daniel Roseman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-11 12:54:21

Kiedy robisz Ajax nie sądzę, że masz jakiekolwiek zastosowanie do szablonów. Szablon jest tam tak, że można generować dynamiczny HTML po stronie serwera łatwo i dlatego dostarcza kilka haków programistycznych wewnątrz HTML.

W przypadku Ajax przekazujesz dane JSON i możesz je formatować tak, jak chcesz w Pythonie. a elementy HTML / document będą generowane po stronie klienta przy użyciu JSON przez jakąś bibliotekę JavaScript np. jQuery po stronie klienta.

Może jeśli masz bardzo szczególny przypadek zastępując jakiś wewnętrzny HTML od strony serwera HTML to może można użyć szablonów ale w takim razie po co Ci JSON? Możesz po prostu odpytywać stronę HTML za pomocą Ajax i zmienić wewnętrzny lub zewnętrzny lub jakikolwiek HTML.

 6
Author: Anurag Uniyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-11 12:53:42

Szablony służą do Prezentacji . Odpowiadanie danymi w formacie X (JSON, JSONP, XML, YAML, *ml itp.) nie jest prezentacją, więc nie potrzebujesz szablonów. Po prostu serializuj swoje dane do formatu X i zwróć je w odpowiedzi HttpResponse.

 3
Author: yfeldblum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-11 12:58:15

Chociaż szablony są rzeczywiście tylko do celów prezentacji, nie powinno mieć znaczenia, czy robisz to po stronie serwera czy po stronie klienta. Wszystko sprowadza się do oddzielenia logiki sterowania, która wykonuje akcję, od logiki widoku, która jest po prostu odpowiedzialna za tworzenie znaczników. Jeśli twoja logika sterowania javascript musi obsługiwać sposób renderowania lub wyświetlania HTML, możesz to robić źle, ale jeśli wyizolujesz tę logikę renderowania do innego obiektu lub funkcji, i wystarczy przekazać mu dane niezbędne do renderowania, wtedy powinno być dobrze; odzwierciedla to, jak oddzielamy nasze kontrolery, modele i widoki po stronie serwera.

Spójrz na projekt github: http://github.com/comolongo/Yz-Javascript-Django-Template-Compiler

Kompiluje szablony django do zoptymalizowanych funkcji javascript, które będą generować Twój HTML Prezentacji z danymi, które go przekazujesz. Skompilowane funkcje są w czystym javascript, więc nie ma zależności od innych bibliotek. Ponieważ szablony są kompilowane zamiast parsowania w czasie wykonywania, łańcuchy i zmienne są już umieszczone w łańcuchach javascript, które muszą być po prostu konkatenowane, więc uzyskujesz ogromny wzrost prędkości w porównaniu do technik, które wymagają manipulacji dom lub parsowania skryptów, aby uzyskać ostateczną prezentację. W tej chwili są tam tylko podstawowe tagi i filtry, ale powinno wystarczyć dla większości rzeczy, a więcej tagów zostanie dodanych jako ludzie zacznij składać wnioski o nie lub zacznij przyczyniać się do projektu.

 3
Author: Weiss I Nicht,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-09 07:45:59

Możesz użyć jquery.load() lub podobnego, generując HTML na serwerze i ładując go do DOM za pomocą JavaScript. Myślę, że ktoś nazwał to AJAH .

 1
Author: Skylar Saveland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-28 14:32:56

Niestety, Szablony Django są przeznaczone tylko do wykonywania po stronie serwera. Istnieje co najmniej jeden projekt do renderowania szablonów Django przy użyciu Javascript, ale nie korzystałem z niego i nie wiem, jak szybko, dobrze obsługiwany lub aktualny jest. Poza tym, musisz albo użyć szablonów Django na serwerze, albo wygenerować dynamiczne elementy na Kliencie bez użycia szablonów.

 0
Author: Casebash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-18 06:15:13