Generyczne Widoki
Począwszy od Django 1.3 te generyczne widoki zostały oznaczone jako przestarzałe. Należy stosować widoków opartych o klasy
Generic Views - "Ogólne" widoki Django wykonują z góry określoną czynność i są bardzo poręczne przy tworzeniu widoków o "popularnej" funkcjonalności. Generyczne widoki nie zostały stworzone jako zastępstwo własnych widoków. Jeżeli potrzebujemy coś więcej, niż to, co oferuje generyczny widok to musimy napisać własny widok. Oto lista generycznych widoków:
Proste widoki
- django.views.generic.simple.direct_to_template
- django.views.generic.simple.redirect_to
Widoki bazujące na dacie
- django.views.generic.date_based.archive_index
- django.views.generic.date_based.archive_year
- django.views.generic.date_based.archive_month
- django.views.generic.date_based.archive_week
- django.views.generic.date_based.archive_day
- django.views.generic.date_based.archive_today
- django.views.generic.date_based.object_detail
Widoki Listuj/Pokaż
- django.views.generic.list_detail.object_list
- django.views.generic.list_detail.object_detail
Widoki stwórz/edytuj/kasuj
- django.views.generic.create_update.create_object
- django.views.generic.create_update.update_object
- django.views.generic.create_update.delete_object
Proste widoki
Funkcja django.views.generic.simple.direct_to_template parsuje podany szablon przekazując do szablonu słownik {{ params }} zawierający parametry złapane z URLa. Przykład: Żądanie /foo/ wyświetliłoby szablon foo_index.html, a żądanie /foo/15/ szablon foo_detail.html ze zmienną {{ params.id }} o wartości 15. Argument template jest wymagany i wskazuje szablon.Funkcja django.views.generic.simple.redirect_to przekierowuje na podany URL. Podany URL może zawierać formatowanie łańcuchów podobne do słownikowego, które będzie interpolowane względem złapanych z URLa zmiennych. Jeżeli za URL podane będzie None Django zwróci HTTP 410 (Gone). Poniższy przykład przekierowuje z /foo/(id)/ na /bar/(id)/: Argument url jest wymagany i wskazuje URL, na który ma nastąpić przekierowanie.
Złożone widoki
Kolejne, bardziej złożone widoki przyjmują sporą liczbę dodatkowych argumentów, takie jak:- allow_empty - Wartość logiczna, określająca czy wyświetlać stronę w przypadku braku obiektów do wyświetlania. W przypadku ich braku i wartości False widok zwróci błąd 404
- context_processors - Lista parserów template-context, jakie mają być nałożone na szablon widoku.
- extra_context - Słownik z dodatkowymi zmiennymi, jakie mają być przekazane do szablonu
- mimetype - Typ MIME dla wyniku. Domyślnie przyjmuje wartość DEFAULT_MIME_TYPE.
- template_loader - Określa nazwę modułu ładującego szablon. Domyślnie jest to django.template.loader i nie wymaga modyfikacji
- template_name - Nazwa szablonu do wykorzystania.
django.views.generic.list_detail.object_list listuje wpisy danego modelu z możliwością listowania. Wymagany argument to queryset - czyli "zapytanie" ORMa Django zwracające określony wynik. Przykładowo, mamy prosty model: A do urls.py dodajemy: Przypisujemy listowanie news wraz ze stronicowaniem na stronie głównej (/). Zmienna paginate_by określa ile wpisów wyświetlać na jednej stronie. Do szablonu przekazanie zostanie zmienna object_list zawierająca wpisy. Przykładowy szablon: Zmienna QueryString page określa stronę stronicowania dla tego generycznego widoku. Oprócz tego w szablonie mamy zmienne:
- is_paginated - Wartość logiczna, True jeżeli lista jest stronicowana (i jest wystarczająca ilość wpisów)
- has_next - Wartość logiczna, czy jest kolejna strona stronicowania
- has_previous - Wartość logiczna, czy jest wcześniejsza strona stronicowania
- page - Numer obecnej strony stronicowania
- next, previous - Numer następnej, poprzedniej strony stronicowania
- pages - Liczba wszystkich stron stronicowania
Zmienną stronicowania zamiast w QueryString można wpisać w URL podając go w wyrażeniu:
I http://localhost:8080/2/ będzie równoznaczne z http://localhost:8080/?page=2
django.views.generic.list_detail.object_detail wyświetla określony wpis identyfikowany po ID lub polu typu slugField. Do szablonu przekazana zostanie zmienna {{ object }} zawierająca wszystkie dane wybranego wpisu. Przykładowo prosty model z polem SlugField: I generyczny widok:
- slug_field - Określa wartość pola typu SlugField, po której odnaleziony ma być wpis (nazwa zmiennej z URLa jak i nazwa pola typu SlugField modelu)
- slug - Ustawiona wartość pola typu SlugField w modelu
- object_id - Określa wartość pola "id" modelu, po której odnaleziony ma być wpis (nazwa zmiennej z URLa)
Widoki bazujące na dacie - wpisy archiwalne
Widoki generyczne zebrane w django.views.generic.date_based pozwalają wyświetlać wpisy na podstawie dany - sposób na prezencję archiwalnej zawartości.django.views.generic.date_based.archive_index tworzy "stronę główną" dla archiwum - generuję listę lat, dla których istnieją wpisy oraz wyświetla listę najnowszych wpisów. queryset, jak i date_field są wymagane. date_field Określa nazwę pola typu DateField lub DateTimeField modelu. Dodatkowe argumenty: allow_future - Wartość logiczna, określająca czy dołączyć obiekty z "przyszłości", num_latest - liczba ostatnich wpisów jakie mają być przekazane do szablonu, domyślnie 15. Oprócz tego obsługiwane są: allow_empty, context_processors, extra_context, mimetype, template_loader, template_name.
Jeżeli template_name nie będzie określone przyjęta zostanie domyślna wartość [etykieta_aplikacji]/[nazwa_modelu]_archive.html
Do szablonu przekazane zostaną dwie zmienne: date_list - listę obiektów datetime.date dla poszczególnych lat, dla których istnieją wpisy. latest - lista ostatnich wpisów.django.views.generic.date_based.archive_year umożliwia tworzenie archiwów dla poszczególnych lat pokazując miesiące, dla których istnieją wpisy. Dochodzi trzeci wymagany argument year określający rok (czterocyfrowy zapis). Argument opcjonalny make_object_list przyjmuje wartość logiczną i w przypadku True do szablonu przekazana zostanie pełna lista obiektów pod zmienną {{ object_list }}. Przykładowy URLconf: Do szablonu zostanie przekazana zmienna date_list, lista obiektów datetime.date miesięcy, dla których istnieją wpisy.
django.views.generic.date_based.archive_month umożliwia tworzenie archiwów dla poszczególnych dni miesiąca. Przykładowy URLconf: Wymagany argument month określa dany miesiąc. Domyślny format to trzyliterowy skrót nazwy miesiąca (angielskiej nazwy) np.: "jan", "feb". By stosować zapisu liczbowego należy podać argument opcjonalny month_format o wartości "%m". Do szablonu przekazane zostaną zmienne:
- month - obiekt datetime.date reprezentujący bieżący miesiąc
- next_month - to samo dla kolejnego miesiąca. Jeżeli wypada w przyszłości zmienna przyjmie wartość None.
- previous_month - to samo dla wcześniejszego miesiąca
- object_list - lista obiektów dostępna dla danego miesiąca. Nazwa zmiennej zależy od wartości template_object_name (domyślnie "object"). W przypadku przypisania innej wartości do template_object_name otrzymamy WARTOŚĆ_list
Używanie Generycznych widoków we własnych widokach
Generyczny widok django.views.generic.list_detail.object_list jest bardzo poręczny. Ten jak i inne widoki generyczne można wykorzystać w zwykłych widokach (gdy chcemy jego funkcjonalności ale musimy także wykonać inny dodatkowy kod uniemożliwiający bezpośrednie zastosowanie generycznego widoku). Oto przykład widoku listującego posty danego tematu: Z regułą URLconf: Widok post_list zwraca object_list czyli generyczny widok listujący wpisy ze stronicowaniem. Podane są takie argumenty jak "paginate_by" czy extra_context zawierający dodatkowe zmienne przekazywane do szablonu. W porównaniu do wersji z URLconf pierwszy argument to "request", a drugi - nasz queryset - te argumenty są wymagane, w takiej kolejności. Po nich możemy podać pozostałe.
RkBlog