Widoki generyczne
Transkrypt
Widoki generyczne
Widoki generyczne Wprowadzenie Tworzenie aplikacji internetowych wymaga często stosowania tych samych metod postępowania (wzorców postępowania) dla różnych danych. Często wymagałoby to wielokrotnego implementowania praktycznie tych samych elementów. Stąd też pojawiły się widoki generyczne dla najczęściej stosowanych widoków. Do realizacji postawionych celów użyjemy widoków generycznych opartych na klasach (wprowadzonych w Django 1.3). Klasy widoków generycznych Wszystkie użyte tutaj klasy widoków generycznych są zdefiniowane w module django.views.generic. Koniczne jest zdefiniowanie odpowiedniego wpisu w pliku urls.py i szablonu strony. Często nie ma potrzeby jawnego stosowania słowników zawierających nazwy zmiennych i ich zawartości, widok dostarcza własnych zmiennych, które mogą być użyte do definicji szablonu strony (ich nazwy zostały wymienione przy opisie poszczególnych widoków). Przykłady zakładają, że używane jest przekazywanie argumentów do funkcji widoku as_view(). Jest to zapisywane wewnątrz urls.py (możliwe jest również tworzenie własnych widoków na podstawie widoku generycznego z wykorzystaniem dziedziczenia). ListView Widok ten jest użyteczny w przypadku przedstawienia listy zawierającej wiele obiektów pobranych na przykład z zapytania. W szablonie lista wszystkich obiektów jest dostępna pod nazwą object_list. Fragment pliku urls.py: url(r'^$', ListView.as_view( queryset=Order.objects.all(), template_name="order.html")) Przykładowy szablon order.html: {% extends "base.html" %} {% block content %} <h2>Zamówienia</h2> <ul> {% for order in object_list %} <li>{{ order }}</li> {% endfor %} </ul> {% endblock %} DetailView Widok ten jest użyteczny w przypadku wyświetlania szczegółów dotyczących jednego obiektu (np. szczegóły jednego. W szablonie obiekt, dla którego mają być wyświetlane szczegóły jest dostępny pod nazwą object (nie ma potrzeby specyfikowania słownika zawierającego obiekt, którego dane będą wyświetlane). Jeśli ustawiono zawartość zmiennej context_object_name to jest również dostępna zmienna o nazwie pobranej z context_object_namej o tej samej zawartości co object. Fragment pliku urls.py: url(r'^(?P<pk>\d+)$', DetailView.as_view( model=Order, template_name="detail.html")) (?P<pk>\d+) - nazwane wyrażenie regularne, nazwa jest zapisana wewnątrz nawiasów okrągłych, pk jest parametrem wykorzystywanym przez ten widok. Zadanie Dla modeli z poprzedniego zadania sporządzić korzystając z widoków generycznych strony zawierające wszystkie zamówienia, każde zamówienie na liście zamówień powinno zawierać link do strony zawierającej szczegóły dotyczące tego zamówienia.