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.

Podobne dokumenty