Tworzenie aplikacji w Django



Podobne dokumenty
Modele. Najcz. Metoda unicode definiuje sposób wyświetlania obiektu w postaci tekstowej. BooleanField - pole logiczne, True/False

Zaawansowany kurs języka Python

Laboratorium Kierunki Rozwoju oprogramowania REST, Django

Laboratorium 7 Blog: dodawanie i edycja wpisów

Backend Administratora

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Dokumentacja serwisu internetowego Zespołu Szkół Technicznych w Radomiu.

CMS - INFORMACJE. *** Mirosław Kuduk E mail: tel. kom DODATKOWE FUNKCJE - PANEL ADMINISTRATORA

Kurs rozszerzony języka Python

e-wsparcie Barbara Muszko Aktualizacja Twojej witryny internetowej tak prosta, jak obsługa Worda

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

AKTYWNY SAMORZĄD. Instrukcja użytkownika.

I. Informacje ogólne. Jednym z takich systemów jest Mambo.

System Obsługi Zleceń

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

CMS Admin instrukcja administratora

Instrukcja obsługi funkcji specjalnych szablonu C01 v.1.0

Pomoc dla systemu WordPress

VinCent Administrator

Instrukcja Integracja z istore. Wersja z 07/02/2015. Copyright Zakupteraz.pl

Instrukcja użytkownika

Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6

Laboratorium - Poznawanie FTP

Platforma e-learningowa

INSTRUKCJA OBSŁUGI BIULETYNU INFORMACJI PUBLICZNEJ

Integracja z Facebook. Wersja 7.2.4

Podstawy technologii WWW

Wdrożenie modułu płatności eservice. dla systemu Gekosale 1.4

Praca w programie dodawanie pisma.

1. Logowanie się do panelu Adminitracyjnego

4. Podstawowa konfiguracja

Baza danych sql. 1. Wprowadzenie

SSI Web 8. (badania.kozminski.edu.pl) Instrukcja logowania i uruchamiania ankiety

Wdrożenie modułu płatności eservice. dla systemu Magento

Zamawianie Taxi Aktywator Instrukcja użytkownika

Zadanie 5. Automatyzacja tworzenia kont użytkowników

Program Import Kontrahentów XLS dla Subiekta GT.

Compas 2026 Vision Instrukcja obsługi do wersji 1.07

(wersja robocza) Spis treści:

Quiz Aplikacja internetowa

autor poradnika - KS Jak zamieszczać i edytować artykuły na szkolnej stronie internetowej

Systemy operacyjne. Zasady lokalne i konfiguracja środowiska Windows 2000

Kadry Optivum, Płace Optivum

SPIS TREŚCI. Sposób pierwszy... 3 Sposób drugi Ikony banków Ikony dostawców Strona1

Zalogowanie generuje nowe menu: okno do wysyłania plików oraz dodatkowe menu Pomoc

Instrukcja instalacji wtyczki Przelewy24

Zastępstwa Optivum. Jak przenieść dane na nowy komputer?

Wysyłka dokumentacji serwisowej z Sekafi3 SQL do producentów.

Dokumentacja. Realizacja w portalu kalkulatora simple. (dane wprowadzane z klawiatury).

Problemy techniczne SQL Server

PWI Instrukcja użytkownika

Marketing Automation:

Duszpasterstwo Akademickie Petra. Podręcznik administratora newslettera html

tel fax

Tworzenie prezentacji w MS PowerPoint

2. Podstawy narzędzia Application Builder, budowa strony, kreatory aplikacji

Instalacja i obsługa generatora świadectw i arkuszy ocen

Przewodnik użytkownika (instrukcja) AutoMagicTest

Instalacja systemu zarządzania treścią (CMS): Joomla

1. Dockbar, CMS + wyszukiwarka aplikacji Dodawanie portletów Widok zawartości stron... 3

Przed rozpoczęciem pracy otwórz nowy plik (Ctrl +N) wykorzystując szablon acadiso.dwt

Instrukcja obsługi programu DHL EasySHip v. 5.3.x

Nowa Netia administrator firmy Nagrywanie połączeń-zarządzanie

Podręcznik Integracji

Instrukcja obsługi Zaplecza epk w zakresie zarządzania tłumaczeniami opisów procedur, publikacji oraz poradników przedsiębiorcy

Dokumentacja panelu Klienta

Wprowadzenie do Doctrine ORM

KASK by CTI. Instrukcja

Rys. 1. Widok uruchomienia polecenia apt-get install build-essential. Rys. 2. Widok uruchomienia polecenia apt-get install apache2

Problemy techniczne SQL Server

Instrukcja obsługi uczelnianego systemu zarządzania stronami internetowymi (CMS)

Podstawy obsługi modułu administracyjnego

Symfonia Produkcja Instrukcja instalacji. Wersja 2013

Instrukcja importu przesyłek. z Menedżera Sprzedaży do aplikacji Webklient

DOKUMENTY I GRAFIKI. Zarządzanie zawartością Tworzenie folderu Dodawanie dokumentu / grafiki Wersje plików... 7

INSTRUKCJA UŻYTKOWNIKA GENERATORA WNIOSKÓW O DOFINANSOWANIE DLA WNIOSKODAWCÓW

Serwis jest dostępny w internecie pod adresem Rysunek 1: Strona startowa solidnego serwisu

Aplikacja Dodatkowe zakładki Shoper Appstore REALIZACJA

Paradygmaty programowania. Paradygmaty programowania

Modele danych walidacja widoki zorientowane na model

Jako lokalizację, w której będzie kontynuowana praca w przyszłym roku szkolnym, warto wybrać tę, w której zgromadzonych jest więcej danych.

Instalacja platformy Magento CE wersja szybka

Program Import dokumentów XLS dla Subiekta GT.

Spis treści. 1. Konfiguracja systemu ewuś Logowanie się do systemu ewuś Korzystanie z systemu ewuś Weryfikacja cykliczna...

Chatter Aplikacja internetowa

KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED

1.1 Podłączenie Montaż Biurko Montaż naścienny... 4

INSTRUKCJA OBSŁUGI SYSTEM ZARZĄDZANIA TREŚCIĄ

I. Program II. Opis głównych funkcji programu... 19

Podręcznik użytkownika Wprowadzający aplikacji Wykaz2

Krótka instrukcja instalacji

Instrukcja instalacji wtyczki Przelewy24

ELEKTRONICZNA KSIĄŻKA ZDARZEŃ

MATERIAŁY - udostępnianie materiałów dydaktycznych w sieci SGH

Należy zalogować się do starego systemu pocztowego, znajdującego się pod adresem podanym powyżej. Kliknąć 'Options'

GENERATOR OFERTY PDF DOKUMENTACJA UŻYTKOWA 1/20

Instrukcja laboratoryjna

Instrukcja użytkownika Porównywarki cen Liquid

Instrukcja Integracja z Shoper. Wersja z 18/01/2015. Copyright Zakupteraz.pl

Transkrypt:

Tworzenie aplikacji w Django Warsztaty IT, +48 603 604 291, szkolenia@warsztatyit.pl http://warsztatyit.pl/

Tworzenie aplikacji w Django Ćwiczenia 1 Poczatki projektu 1.1 Utwórz projekt gazetr 1.2 Skonfiguruj projekt 1.3 Dodaj interfejs administracyjny Spis treści 1.4 Utwórz aplikacj e news z modelem Category 1.5 Pod l acz Category do panelu administracyjnego 1.6 Utwórz grupy i użytkowników 1.7 Utwórz potrzebne kategorie 1.8 Dodaj aplikacj e admindocs 1.9 Wyświetl pe lne dane kategorii w spisie 1.10 Dodaj opis do pól kategorii 1.11 Wymuś unikalność nazwy kategorii 2 Modele 2.1 Utwórz model Article w aplikacji news 2.2 Dodaj model Article do panelu administracyjnego 2.3 Dodaj opis do pól Article 2.4 Dodaj kilka artyku lów 2.5 Utwórz aplikacj e visuals z modelem MenuEntry 2.6 Dodaj MenuEntry do panelu administracyjnego 2.7 Uaktualnij uprawnienia 2.8 Utwórz potrzebne wpisy menu 2.9 Utwórz aplikacj e ads z modelem Advertisement 2.10 Dodaj model Advertisement do interfejsu administracyjnego 2.11 Ogranicz list e możliwych wartości pola sort order w Advertisement 2.12 Dodaj dwie reklamy 3 Strony publiczne 3.1 Utwórz stron e kategorii 3.2 Wyświetl wszystkie dane kategorii 1

3.3 Utwórz bazowy szablon ca lego serwisu 3.4 Dodaj pliki z oprawa graficzna 3.5 Wyświetl liste artyku lów w kategorii 3.6 Zdefiniuj metody get absolute url dla kategorii i artyku lów 3.7 Popraw wyglad strony kategorii 3.8 Utwórz strone artyku lu 3.9 Popraw wyglad strony artyku lu 3.10 Popraw tytu ly stron artyku lu i kategorii 3.11 Utwórz stron e użytkownika 4 W lasne widoki, formularze 4.1 Utwórz aplikacj e contact z modelem Message 4.2 Utwórz formularz i widok do jego obs lugi 4.3 Dodaj sprawdzanie poprawności danych 4.4 Dodaj sprawdzanie poprawności do interfejsu administracyjnego 4.5 Popraw wyglad strony kontaktowej 4.6 Dodaj do wszystkich stron liste kategorii 4.7 Dodaj do wszystkich stron list e sponsorów 4.8 Dodaj do wszystkich stron list e wpisów do menu 4.9 Dodaj sprawdzanie poprawności danych, cz eść 2 4.10 Dodaj stron e dzi ekujemy za wiadomość 5 Strona g lówna, api bazodanowe 5.1 API bazy danych - wprowadzenie 5.2 Filtrowanie 5.3 Filtrowanie na podstawie pól modeli po l aczonych 5.4 Pobieranie pojedynczych obiektów 5.5 Sortowanie wyników 5.6 Uzupe lnij dane w bazie 5.7 Napisz bazowy widok i szablon strony g lównej 5.8 Popraw wyglad strony g lównej 5.9 Dodaj do wszystkich stron liste ostatnich wydarzeń 5.10 Api bazy danych: zmiany wpisów 6 Komentarze, strony statyczne 6.1 Dodaj aplikacj e comments 6.2 Dodaj formularz komentarza do strony artyku lu 6.3 Dostosuj strone podgladu komentarza 6.4 Popraw strone Dziekujemy za komentarz 6.5 Dodaj list e komentarzy 6.6 Dodaj moderacj e 6.7 Rozbuduj funkcje moderujac a 2

6.8 Dodaj strony z informacjami o b l edach 6.9 Dodaj strony o serwisie i regulamin 6.10 Wype lnij powitanie 7 Profile użytkowników, przydatne aplikacje 7.1 Dodaj model na profile użytkowników 7.2 Dodaj widok do edycji profilu 7.3 Dodaj feed z artyku lami 7.4 Dodaj feed ze wszystkimi komentarzami 7.5 Feed z artyku lami: zmień zawartość description na zapowiedź 7.6 Popraw miniatury w serwisie 7.7 Debugowanie: dodaj informacje o wykonanych zapytaniach 3

1 Poczatki projektu 1.1 Utwórz projekt gazetr Tworzenie Aplikacji w Django, http://warsztatyit.pl/ Nowy projekt tworzy si e programem django-admin.py, poleceniem startproject. 1 # w katalogu serwis_gazetr 2 $ /sciezka/do/django-1.0.2-final/django/bin/django-admin.py startproject gazetr 3 $ ls gazetr 4 init.py manage.py settings.py urls.py Bezpośrednio po utworzeniu projekt powinien dać si e uruchomić. 1 # w katalogu serwis_gazetr 2 $ cd gazetr 3 $ python manage.py runserver 4000 4 Validating models... 5 0 errors found 6 7 Django version 1.0.2 final, using settings gazetr.settings 8 Development server is running at http://127.0.0.1:4000/ 9 Quit the server with CONTROL-C. Teraz można otworzyć przegladark e, pod adresem http://127.0.0.1:4000/ powinna pojawić sie strona It worked!. 1.2 Skonfiguruj projekt Potrzebne zmiany w settings.py: ADMINS: imi e, nazwisko i adres email administratora DATABASE ENGINE: sterownik bazy danych, na nasze potrzeby: sqlite3 DATABASE NAME: nazwa bazy danych, w przypadku sqlite3 to też nazwa pliku; gazetr.db3 LANGUAGE CODE: kod j ezyka, pl MEDIA ROOT: katalog z plikami graficznymi, CSS i innymi statycznymi, static/ Utwórz też katalog static/: 1 # w katalogu gazetr 2 $ mkdir static Polskie litery w plikach.py W plikach z programami w Pythonie można używać polskich znaków, ale trzeba poinformować interpreter w jaki sposób zosta ly zakodowane. Na poczatku każdego pliku w którym użyjesz polskich liter, należy podać kodowanie umieszczajac w pierwszej linii tekst: # -*- encoding: utf-8 -*- 4

Po wskazaniu bazy danych można już utworzyć podstawowe tabele. Django spyta o dane administratora, wpisz login admin z has lem admin. 1 # w katalogu gazetr 2 $ python manage.py syncdb 3 Creating table auth_permission 4 Creating table auth_group 5 [...] 6 You just installed Django s auth system, which means you don t have any superusers 7 Would you like to create one now? (yes/no): yes 8 Username (Leave blank to use marcink ): admin 9 E-mail address: twoj-adres-email 10 Password: 11 Password (again): 12 [...] Kopie zapasowe To jest dobry moment, żeby zaczać tworzyć kopie zapasowe Twojego projektu; kod, który tworzysz, bedzie potrzebny w kolejnych cześciach zajeć. Czesto, najlepiej po każdym ćwiczeniu zapisuj kolejna kopie ca lego katalogu ze źród lami: $ cp -r gazetr gazetr_(nr_czesci)_(nr_cwiczenia) Na przyk lad, po tym ćwiczeniu bedzie to: $ cp -r gazetr gazetr_1_4 Parametr -r oznacza kopiowanie katalogu razem z ca l a zawartościa. 1.3 Dodaj interfejs administracyjny W pliku settings.py dodaj django.contrib.admin na końcu INSTALLED_APPS W pliku urls.py odkomentuj linie: from django.contrib import admin admin.autodiscover() (r ^admin/(.*), admin.site.root), Po każdym dodaniu aplikacji lub modelu trzeba uruchomić syncdb: 1 # w katalogu gazetr 2 $ python manage.py syncdb 3 Creating table django_admin_log 4 Installing index for admin.logentry model Uruchom ponownie serwer i zaloguj si e do interfejsu administracyjnego pod adresem http://127.0.0.1:4000/admin/. W panelu administracyjnym zmień ustawienia domyślnej strony (site): domain name: z example.com na 127.0.0.1:4000 5

display name: z example.com na gazetr 4000 to numer portu, na którym b edziemy uruchamiać serwer. Uwaga: po zmianie tego ustawienia trzeba ponownie uruchomić serwer -- ze wzgl edów wydajnościowych jest wczytywane tylko przy starcie. 1.4 Utwórz aplikacj e news z modelem Category 1 # w katalogu gazetr 2 $ python manage.py startapp news 3 $ ls news 4 init.py models.py views.py W pliku settings.py dodaj gazetr.news do INSTALLED_APPS. W pliku news/models.py utwórz model Category: 1 from django.db import models 2 from django.contrib.auth.models import User 3 4 class Category(models.Model): 5 name = models.charfield(max_length=100, null=false, blank=false) 6 owner = models.foreignkey(user, null=false, blank=false) 7 description = models.textfield(null=false, blank=false) 8 9 def unicode (self): 10 return self.name Przeprowadź ponownie syncdb. 1.5 Pod l acz Category do panelu administracyjnego Utwórz plik news/admin.py z zawartościa: 1 from gazetr.news.models import Category 2 from django.contrib import admin 3 4 class CategoryAdmin(admin.ModelAdmin): 5 pass 6 7 admin.site.register(category, CategoryAdmin) Przejdź do interfejsu administracyjnego. modelem Category. Na stronie g lównej pojawi la si e nowa aplikacja, News, z 6

1.6 Utwórz grupy i użytkowników Utwórz dwie grupy użytkowników: edytorzy, z pe lnymi uprawnieniami do news.category autorzy, na razie bez uprawnień Utwórz użytkowników, z has lami takimi samymi jak login: edytor 1, z zaznaczonym polem w zespole, należacy do grupy edytorzy (na stronie dodawania użytkownika jest miejsce tylko na login i has lo, pozosta le pola pojawia sie po kliknieciu w zapisz i kontynuuj edycje ) autor 1, z zaznaczonym polem w zespole, należacy do grupy autorzy gosc, z polem w zespole pustym Zaloguj si e do panelu jako autor 1. Powinna si e pojawić strona Nie masz uprawnień, by edytować cokolwiek. Zaloguj si e do panelu jako edytor 1. Powinien pojawić si e interfejs do edycji kategorii. Spróbuj zalogować si e do panelu jako gosc. Nie uda si e, bo nie jest oznaczony jako w zespole. 1.7 Utwórz potrzebne kategorie Utwórz kategorie: Gospodarka, w laściciel: edytor 1 Kultura, w laściciel: edytor 1 Sport, w laściciel: edytor 1 Technika, w laściciel: admin Wydarzenia, w laściciel: admin 1.8 Dodaj aplikacj e admindocs Dodaj django.contrib.admindocs do INSTALLED_APPS. Odkomentuj linijk e z /admin/doc/ w pliku urls.py. Po tych zmianach w nag lówku interfejsu administracyjnego pojawi l si e odsy lacz Dokumentacja. Przejrzyj dokumentacj e widocznych modeli. Zajrzyj do opisu Category -- widać tam wszystkie pola modelu, w tym po l aczenie z modelem auth.user. 7

1.9 Wyświetl pe lne dane kategorii w spisie Zmień CategoryAdmin tak, żeby: na liście kategorii by lo widać nazw e, w laściciela i opis (parametr list_display) możliwe by lo wyszukiwanie tekstowe wed lug zawartości pól name i description (parametr search_fields) widoczny by l filtr wed lug zawartości pola owner (parametr list_filter) Uruchom ponownie serwer i sprawdź, czy na stronie z lista kategorii: dzia la wyszukiwanie dzia la filtrowanie wed lug zawartości pola owner można sortować list e wed lug dowolnej kolumny 1.10 Dodaj opis do pól kategorii Do pól modelu Category dodaj parametry verbose_name i help_text, odpowiednio: name: Nazwa i Nazwa kategorii pokazywana w spisie owner: W laściciel i Użytkownik odpowiedzialny za artyku ly w tej kategorii description: Opis i Opis wyświetlany na stronie kategorii; można używać HTML Pamietaj o dopisaniu na poczatku pliku informacji o kodowaniu (-> ćwiczenie 4, ramka Polskie litery w plikach.py ). Uruchom ponownie serwer i sprawdź czy nowe opisy widać: w edytorze kategorii w dokumentacji modelu Category (tu nie pojawi si e verbose_name) 1.11 Wymuś unikalność nazwy kategorii Zmień model Category tak, żeby nazwa kategorii nie mog la si e powtarzać (atrybut unique). Zrestartuj serwer i sprawdź, czy możesz wpisać dwie kategorie z taka sama nazwa. Wi ecej informacji wynik python manage.py --help Dokumentacja Django, django-admin.py and manage.py: Overview : http://docs.djangoproject.com/en/dev/ref/django-admin/ 8

2 Modele 2.1 Utwórz model Article w aplikacji news Utwórz model Article, z polami: title: krótki tekst, unikalny, wymagany image: obrazek, wymagany teaser: zapowiedź na strone g lówna, d luższy tekst; opcjonalny content: zawartość, d luższy tekst w HTML; wymagany created: data i godzina utworzenia; ustawiana automatycznie changed: data i godzina ostatniej zmiany; ustawiana automatycznie category: kategoria artyku lu; wymagana featured: tak/nie, jeśli zaznaczony, to artyku l pojawi si e w sekcji wyróżnione lead story: tak/nie, jeśli zaznaczony, to artyku l pojawi si e w boksie Wiadomość dnia author: po l aczenie z modelem auth.user, wymagane Pole ImageField wymaga podania parametru upload_to -- ścieżki do katalogu, w którym zapisane zostana obrazki, wzgledem settings.media_root. Wpisz upload/. Pola category i autor powinny być typu ForeignKey, odwo lujacym sie odpowiednio do modeli Category i User. Pola lead_story i featured powinny być typu BooleanField. Metoda unicode powinna zwracać title. 2.2 Dodaj model Article do panelu administracyjnego W pliku news/admin.py, analogicznie do CategoryAdmin. Lista artyku lów powinna zawierać kolumny: title created author category featured lead story Dodaj filtrowanie wed lug zawartości pól: author 9

category featured lead story W l acz przegladanie Article wg hierarchii dat, wed lug pola created Dodaj wyszukiwanie wed lug zawartości pól title i content. 2.3 Dodaj opis do pól Article Do pól modelu Article dodaj parametry verbose_name i help_text, odpowiednio: teaser: Zapowiedź i Zapowiedź artyku lu, można używać HTML content: Zawartość i Zawartość artyku lu, można używać HTML featured: Wyróżniony i jeśli zaznaczony, to artyku l pojawi si e w sekcji wyróżnione lead story: Wiadomość dnia i jeśli zaznaczony, to artyku l pojawi si e w boksie Wiadomość dnia Dla pozosta lych pól ustaw polskie verbose_name, ale już bez help_text. Uruchom ponownie serwer i sprawdź czy nowe opisy widać: w edytorze artyku lów w dokumentacji modelu Article (verbose_name pojawi sie tylko dla pól, które nie maja ustawionego help_text) 2.4 Dodaj kilka artyku lów Korzystajac z dostarczonych materia lów utwórz cztery artyku ly: w kategorii Technika Superkomputer..., wyróżniony, autor: autor 1 NVIDIA..., autor: edytor 1 w kategorii Wydarzenia Klub Harenda..., wiadomość dnia, autor: autor 1 Patio TV..., wiadomość dnia, autor: edytor 1 2.5 Utwórz aplikacj e visuals z modelem MenuEntry Utwórz aplikacje i dodaj ja do INSTALLED_APPS. W pliku visuals/models.py utwórz model MenuEntry z polami: title: krótki tekst, wymagany target url: krótki tekst -- odsy lacz, do którego dany wpis prowadzi; wymagany sort order: liczba, pozycja na liście, wymagana Metoda unicode powinna zwracać tytu l wpisu. 10

2.6 Dodaj MenuEntry do panelu administracyjnego Utwórz plik visuals/admin.py z klasa MenuEntryAdmin, analogicznie jak w przypadku Category i CategoryAdmin. Skonfiguruj MenuEntryAdmin tak, żeby: na liście wpisów by lo widać sort_order, title i target_url możliwe by lo wyszukiwanie tekstowe wed lug zawartości pól title i target_url Skonfiguruj model MenuEntry tak, żeby by l domyślnie sortowany wed lug zawartości pola sort_order. 2.7 Uaktualnij uprawnienia Edytorzy powinni mieć pe lne prawa do modeli news.article, news.category i visuals.menuentry. Autorzy powinni mieć prawa tylko do modelu news.article. Dodaj te uprawnienia i sprawdź, czy: po zalogowaniu sie jako autor 1 widzisz tylko interfejs do dodawania i edycji artyku lów po zalogowaniu sie jako edytor 1 widzisz wszystkie trzy modele 2.8 Utwórz potrzebne wpisy menu Zaloguj sie jako edytor 1 i utwórz wpisy w MenuEntry: Strona g lówna, target url: /, sort order: 1 O serwisie, target url: /pomoc/o-serwisie/, sort order: 2 Regulamin, target url: /pomoc/regulamin/, sort order: 3 Wydarzenia, target url: /kategoria/5/, sort order: 4 W ostatnim wpisie upewnij sie, że w URL znajduje sie rzeczywiście ID kategorii Wydarzenia. 2.9 Utwórz aplikacj e ads z modelem Advertisement Utwórz aplikacje i dodaj ja do INSTALLED_APPS. Utwórz w niej model Advertisement z polami: title: krótki opis, wymagany image: obrazek, wymagany target url: odsy lacz reklamy, wymagany sort order: pozycja na liście, wymagana Pole ImageField wymaga podania parametru upload_to -- ścieżki do katalogu, w którym zapisane zostana obrazki, wzgledem settings.media_root. Wpisz upload/. Metoda unicode powinna zwracać tytu l reklamy. 11

2.10 Dodaj model Advertisement do interfejsu administracyjnego W pliku ads/admin.py, analogicznie do CategoryAdmin. Lista reklam powinna zawierać pola sort_order, title i target_url, w tej kolejności. Reklamy na liście powinny być domyślnie posortowane wed lug pola sort_order (parametr ordering w modelu, w wewn etrznej klasie Meta). 2.11 Ogranicz list e możliwych wartości pola sort order w Advertisement Zmień model Advertisement tak, żeby dopuszcza l tylko wartości: 1 z opisem platynowy partner 2 z opisem z loty partner 3 z opisem srebrny partner 4 z opisem brazowy partner Upewnij si e, że interfejs edytora nie pozwala na wpisanie innych wartości. 2.12 Dodaj dwie reklamy Przyk ladowe wartości: Oiola.com, target_url: http://oiola.com/, sort_order: 1 El Monito, target_url: http://el-monito.com/, sort_order: 2 Obrazki znajdziesz w katalogu z materia lami, podkatalog grafika. 12

3 Strony publiczne 3.1 Utwórz stron e kategorii Tworzenie Aplikacji w Django, http://warsztatyit.pl/ W pliku urls.py dodaj na poczatku urlpatterns: 1 (r ^kategoria/(?p<object_id>[0-9]+)/$, 2 django.views.generic.list_detail.object_detail, 3 { queryset : Category.objects.all(), 4 template_object_name : category }), To wyrażenie sk lada sie z nastepuj acych elementów: 1 r ^ # poczatek tekstu 2 r kategoria/ # tekst kategoria/ 3 r (?P<object_id>[0-9]+) # liczba, przekazana jako object_id do view 4 r / # slash na koncu adresu 5 r $ # koniec tekstu Wi ec pasuje do adresów kategorii typu /kategoria/123/. Uruchom ponownie serwer testowy i otwórz stron e pod adresem http://127.0.0.1:4000/kategoria/1/ Pojawi sie strona z informacja, że wystapi l b l ad; strona wskazuje dok ladne miejsce wystapienia b l edu, razem z pe ln a lista wywo lań funkcji. Ostatni na tej liście jest w laśnie plik urls.py. Kliknij we wskazana linie kodu, a pojawia sie też sasiednie. B l ad to NameError, z opisem: name Category is not defined. Oznacza, że we wskazanym miejscu (w pliku urls.py) nazwa Category nie ma przypisanego znaczenia. Zaimportuj Category z news.models przez dopisanie w pliku urls.py (przed urlpatterns) linijki: 1 from gazetr.news.models import Category Uruchom serwer ponownie, pojawi sie kolejny b l ad: TemplateDoesNotExist. Brakuje szablonu news/category_detail.html. Konwencja Nazwy szablonów moga być dowolne, ale w wiekszości wypadków warto je tworzyć zgodnie z regu l a nazwa_aplikacji/nazwa_widoku.html. Widoki generyczne object_detail i object_list tworza je na podstawie aplikacji, z której pochodzi wyświetlany model, oraz nazwy modelu. Utwórz katalog na ten szablon: 1 # w katalogu gazetr 2 $ mkdir templates 3 $ mkdir templates/news 13

Dodaj katalog templates do settings.template_dirs: 1 TEMPLATE_DIRS = ( 2 /pelna/sciezka/do/gazetr/templates/, 3 ) I utwórz sam szablon templates/news/category_detail.html, na razie z prosta zawartościa: 1 <p>kategoria: {{ category.name }}</p> Uruchom ponownie serwer testowy, otwórz stron e pod adresem http://127.0.0.1:4000/kategoria/1/ Pojawi sie strona z nazwa kategorii o id równym 1. Uwaga: kolejne ćwiczenia zak ladaja, że kategoria ta zawiera jakieś artyku ly. Jeśli tak nie jest, dodaj je przed przejściem dalej. 3.2 Wyświetl wszystkie dane kategorii Zajrzyj do dokumentacji pod adresem /admin/doc/ i sprawdź, jakie pola sa dostepne w modelu Category. Wyświetl je wszystkie (wliczajac te z article_set) na stronie kategorii, używajac {{ }}. Filtr safe Mechanizm szablonów Django automatycznie przekszta lca wartości wszystkich wstawionych zmiennych, zamieniajac znaki majace szczególne znaczenie w HTML ( &, <, > oraz cudzys lowy) na odpowiednie encje HTML. W wiekszości sytuacji to jest poprawne i bezpieczne zachowanie, ale czasem -- tak jak tutaj, w przypadku pól z zapowiedzia i treścia artyku lu -- konieczne jest pozwolenie na wstawienie bezpośrednio HTML. S luży do tego filtr safe: {{ zmienna safe }}. 3.3 Utwórz bazowy szablon ca lego serwisu Pora zajać sie wygladem strony z kategoriami, ale w taki sposób żeby latwo by lo dodawać kolejne strony korzystajace z tej samej oprawy graficznej. W katalogu z materia lami znajduje si e podkatalog html, a w nim plik base.html. Skopiuj ten plik jako templates/base.html: 1 $ cp /sciezka/do/materialow/html/base.html /sciezka/do/serwis_gazetr/gazetr/templates/ Dopisz do news/category_detail.html lini e extends, żeby dziedziczy l po base.html: 1 {% extends "base.html" %} 14

Otwórz ponownie stron e http://127.0.0.1:4000/kategoria/1/ Widać dwa problemy: 1. brakuje informacji o kategorii wypisywanych przez news/category_detail.html 2. brakuje oprawy graficznej Teraz zajmiemy si e pierwszym. Widać tylko zawartość base.html, bo news/category_detail.html dziedziczy po base.html i nie nadpisuje żadnego fragmentu. W pliku base.html otocz tekst CZEŚĆ G LÓWNA blokiem o nazwie content: 1 {% block content %} 2 CZESC GLOWNA 3 {% endblock content %} Oznacza to, że ten fragment może być nadpisany przez szablony dziedziczace po base.html. W pliku news/category_detail.html też dodaj blok content obejmujacy wszystko poza linijka extends: 1 {% extends "base.html" %} 2 {% block content %} 3 <p>kategoria: {{ category.name }}</p> 4 [...] 5 {% endblock content %} Otwórz ponownie strone http://127.0.0.1:4000/kategoria/1/ Pojawi sie zawartość base.html, ale zamiast tekstu CZEŚĆ G LÓWNA wstawiona zostanie zawartość bloku content z news/category_detail.html. 3.4 Dodaj pliki z oprawa graficzna W katalogu z materia lami znajduje si e podkatalog css. Skopiuj ca ly podkatalog do static/css: 1 $ cp -r /sciezka/do/materialow/css /sciezka/do/serwis_gazetr/gazetr/static/ W normalnych instalacjach pliki te sa obs lugiwane ze wzgledów wydajnościowych ca lkowicie poza Django, czesto przez osobny komputer (lub komputery). Na potrzeby tworzenia aplikacji warto je udostepnić przez serwer testowy, ale w taki sposób żeby latwo można by lo je wy l aczyć po udostepnieniu serwisu publicznie. W pliku settings.py: zmień wartość MEDIA_URL na /static/ -- jest to adres z którego pobierane bed a pliki statyczne, np. obrazki dodaj zmienna SERVE_MEDIA_FILES ustawiona na True; to bedzie zmienna pozwalajaca na w l aczanie obs lugi plików statycznych 15

Na końcu urls.py dopisz obs lug e adresu /static/ z użyciem widoku django.views.static.serve. 1 from django.conf import settings 2 if settings.serve_media_files: 3 urlpatterns = patterns(, 4 (r ^static/(?p<path>.*)$, 5 django.views.static.serve, 6 { document_root : settings.media_root}), 7 ) + urlpatterns Widok ten w odpowiedzi na żadanie ze ścieżka /static/sciezka/do/pliku/ odsy la do przegladarki plik (document_root)/sciezka/do/pliku/. Bezpieczeństwo Widok django.views.static.serve s luży tylko do obs lugi plików podczas prac programistycznych. Nie należy go używać na serwerach dost epnych publicznie: nie jest zabezpieczony przed pobieraniem plików spoza katalogu wskazanego jako document_root. Uruchom ponownie serwer i sprawdź nowe ustawienia otwierajac http://127.0.0.1:4000/static/css/style.css Pojawi si e zawartość pliku CSS. Otwórz ponownie strone http://127.0.0.1:4000/kategoria/1/, bedzie już mia la pe ln a oprawe graficzna. 3.5 Wyświetl list e artyku lów w kategorii W pliku news/category_detail.html dodaj petl e wyświetlajac a wszystkie artyku ly: 1 {% for article in category.article_set.all %} 2 <p><a href="{{ article.get_absolute_url }}">{{ article.title }}</a></p> 3 {% endfor %} Otwórz ponownie stron e http://127.0.0.1:4000/kategoria/1/, powinien pojawić si e spis artyku lów. Odsy lacze maja puste adresy, bo w klasie Article nie istnieje jeszcze pole ani metoda get_absolute_url. URL do zdj ecia jest dost epny jako article.image.url. 3.6 Zdefiniuj metody get absolute url dla kategorii i artyku lów W klasie Category dodaj metod e get_absolute_url: 1 def get_absolute_url(self): 2 return u /kategoria/%s/ % str(self.id) Operator % Operator % s luży do wstawiania wartości do tekstów. Wypróbuj w interpreterze Pythona wyrażenia: >>> %s test % maly >>> To %s wiekszy %s % ( jest, test ) 16

Z tej metody korzysta też interfejs administracyjny: otwórz teraz stron e edycji kategorii Wydarzenia. Po dodaniu get_absolute_url w prawym górnym rogu pojawi l si e odsy lacz Pokaż na stronie. W klasie Article zdefiniuj podobna metode get_absolute_url, zwracajac a adres typu /nr-artykulu/, np /123/. Otwórz ponownie strone http://127.0.0.1:4000/kategoria/1/, odsy lacze artyku lów powinny już mieć odpowiednie adresy (jeszcze nie sa obs lugiwane). 3.7 Popraw wyglad strony kategorii W katalogu z materia lami html, znajduje sie plik category_content.html. Zastap jego zawartościa ca l a zawartość bloku content w pliku news/category_detail.html. Otwórz ponownie strone http://127.0.0.1:4000/kategoria/1/, zamiast rzeczywistych danych kategorii pojawia sie zaślepki wpisane w tym pliku. Zamień je wszystkie na odpowiednie wartości z modelu Category. 3.8 Utwórz stron e artyku lu W pliku urls.py dodaj regu l e podobna do tej dla modelu Category, ale z takimi zmianami: 1. powinna pasować do adresów w postaci 123/, a wi ec bez cz eści kategoria/ 2. zapytanie powinien też obs lugiwać widok object_detail, ale używajac modelu Article i ustawiajac nazwe obiektu w szablonie na article. Po wprowadzeniu zmian otwórz stron e http://127.0.0.1:4000/1/ Pojawia sie podobne b l edy jak podczas dodawania obs lugi kategorii. Popraw je: 1. dodaj odpowiedni import w urls.py 2. dodaj szablon news/article_detail.html z zawartościa: 1 <p>{{ article.title }}</p> Otwórz ponownie stron e http://127.0.0.1:4000/1/, powinien pojawić si e tytu l artyku lu. 3.9 Popraw wyglad strony artyku lu W katalogu z materia lami html, znajduje sie plik article_content.html. news/article_detail.html i zmień ten szablon tak, żeby: Zastap nim zawartość 1. dziedziczy l po base.html 2. zawiera l blok content z kodem z article_content.html 3. zamiast zaślepek wyświetla l rzeczywiste dane z artyku lu URL do zdj ecia jest dost epny jako article.image.url. Pomiń na razie zaślepki zwiazane z komentarzami -- zajmiemy sie nimi później. 17

3.10 Popraw tytu ly stron artyku lu i kategorii Niezależnie od tego, która strone artyku lu lub kategorii sie otworzy, w pasku tytu lowym przegladarki widać zawsze nazwe Gazetr. Znajdź w pliku base.html miejsce, w którym wpisany jest ten tytu l i otocz je blokiem title: 1 <title>{% block title %}Gazetr{% endblock %}</title> Nadpisz ten blok w szablonie news/article_detail.html: 1 {% block title %}{{ article.title }} - Gazetr{% endblock %} Podobnie zmień news/category_detail.html: 3.11 Utwórz stron e użytkownika Utwórz stron e z informacjami o pojedynczym użytkowniku. 1 (r ^u/(?p<slug>[0-9a-z_]+)/$, 2 django.views.generic.list_detail.object_detail, 3 { queryset : User.objects.all(), 4 slug_field : username, 5 template_object_name : account }), Znowu pojawia sie widok object_detail, ale tym razem konfigurujemy go tak, zeby wybiera l obiekty używajac pola innego niż id. Różnice: 1. nazwa zmiennej w wyrażeniu dopasowywanym do ścieżki to slug zamiast object_id 2. w s lowniku z parametrami pojawi l sie dodatkowy parametr, slug_field, zawierajacy nazwe pola które bedzie porównywane z wartościa slug 3. wyrażenie regularne jest tak skonstruowane, że slug pasuje nie tylko do numerów, ale do dowolnych ciagów liter (od a do z ), cyfr i znaku podkreślenia. Brakuje jeszcze szablonu; utwórz go i wype lnij podobnie do stron artyku lów i kategorii. 18

4 W lasne widoki, formularze 4.1 Utwórz aplikacj e contact z modelem Message Utwórz w aplikacji contact model Message z polami: topic, Temat, krótki tekst, wymagany email, Email, EmailField, wymagany content, Zawartość, d lugi tekst, wymagany Metoda unicode powinna zwracać tekst (email): (temat), z wartościami z pól obiektu. Pod l acz model do modelu administracyjnego i upewnij sie że można tworzyć i usuwać wpisy w interfejsie administratorskim. 4.2 Utwórz formularz i widok do jego obs lugi Utwórz plik contact/forms.py z zawartościa: 1 from django import forms 2 from gazetr.contact.models import Message 3 4 class ContactForm(forms.ModelForm): 5 class Meta: 6 model = Message Konwencja Django nie wymaga, żeby formularze by ly umieszczone akurat w pliku aplikacja/forms.py, ale jest to cz esto stosowana konwencja. Utwórz widok contact_view pliku contact/views.py: 1 from django.shortcuts import render_to_response 2 from django.template import RequestContext 3 4 from gazetr.contact.forms import ContactForm 5 6 def contact_view(request): 7 form = ContactForm() 8 return render_to_response( contact/message_form.html, 9 context_instance = RequestContext(request), 10 dictionary = { form : form}) Funkcja render to response render_to_response(template, context_instance, dictionary) Funkcja ta tworzy odpowiedź ze strona utworzona na podstawie szablonu template uzupe lnionego danymi z context_instance i dictionary. 19

Dodaj szablon contact/message_form.html: 1 <form action="." method="post"> 2 <table>{{ form }}</table> 3 <input type="submit" value="zapisz" /> 4 </form> Pod l acz contact_view do urls.py pod adresem kontakt/. 1 (r ^kontakt/$, gazetr.contact.views.contact_view ), Otwórz stron e http://127.0.0.1:4000/kontakt/, pojawi si e formularz. Sprawdź dzia lanie przycisku Zapisz: nic si e nie dzieje, bo widok nie zawiera żadnego kodu poza wyświetleniem formularza. Zmień widok contact_view w ten sposób: 1 from django.http import HttpResponseRedirect 2 3 def contact_view(request): 4 if request.method == "POST": 5 form = ContactForm(request.POST) 6 if form.is_valid(): 7 form.save() 8 return HttpResponseRedirect( /admin/ ) 9 else: 10 form = ContactForm() 11 return render_to_response( contact/message_form.html, 12 context_instance = RequestContext(request), 13 dictionary = { form : form}) Tworzenie obiektu formularza W powyższej funkcji pojawiaja sie dwie metody tworzenia obiektu klasy ContactForm: 1. ContactForm(request.POST) otrzyma l podczas inicjalizacji dane wpisane przez użytkownika; tak utworzony obiekt można wykorzystać do sprawdzenia i zapisania oraz wyświetlenia formularza na stronie 2. ContactForm() nie otrzyma l żadnych danych, wi ec s luży tylko do wyświetlenia formularza na stronie Otwórz ponownie strone http://127.0.0.1:4000/kontakt/. Kliknij Zapisz bez wpisywania danych -- pojawi sie strona z informacja o brakujacych wartościach. Wpisz poprawne dane, kliknij Zapisz. Zostaniesz przekierowany na strone :tt:/admin/; sprawdź, czy wiadomość zosta la rzeczywiście zapisana. Widoki generyczne W praktyce do obs lugi tego typu formularzy wystarczaja widoki generyczne z modu lu django.views.generic.create_update: create_object i update_object. 20

4.3 Dodaj sprawdzanie poprawności danych Formularz ContactForm już teraz sprawdza dane zgodnie z konfiguracja modelu -- sprawdza, czy wpisane zosta ly wszystkie wymagane wartości i czy email ma rzeczywiście poprawny format. Czasem jednak potrzebne jest sprawdzenie dodatkowych warunków. Redakcja serwisu Gazetr nie chce dostawać wiadomości, które: maja zbyt zbyt krótki temat maja treść wiadomości taka sama jak temat Takie warunki można sprawdzić przez odpowiednie rozbudowanie klasy ContactForm. Na przyk lad, dodaj do niej metod e clean_topic: 1 def clean_topic(self): 2 topic = self.cleaned_data[ topic ] 3 if len(topic) < 5: 4 raise forms.validationerror( Zbyt krotki temat ) 5 return topic Otwórz ponownie strone http://127.0.0.1:4000/kontakt/ i spróbuj wys lać wiadomość z tematem zawierajacym tylko 3 litery. Metody clean_(nazwa_pola) s luża do sprawdzania wartości pojedynczych pól. Atrybut self.cleaned_data to s lownik, który zawiera wartości poprawnie wpisanych pól. Można też zdefiniować metode clean, s lużac a do sprawdzania wartości wiecej niż jednego pola: 1 def clean(self): 2 cleaned_data = self.cleaned_data 3 if cleaned_data.get( topic ) == cleaned_data.get( content ): 4 raise forms.validationerror( Temat musi byc inny niz tresc ) 5 return cleaned_data Uwaga: metody clean_(nazwa_pola) zostaja wywo lane dla danego pola tylko pod warunkiem, że zosta lo ono wpisane, wiec moga za lożyć że cleaned_data zawiera jego wartość. W przypadku metody clean takiej gwarancji już nie ma, stad konieczność użycia metody slownik.get( klucz ) zamiast normalnego pobrania wartości przez slownik[ klucz ]. Zwróć uwage: b l edy znalezione przez clean i clean_(nazwa_pola) pojawiaja sie w różnych miejscach. 4.4 Dodaj sprawdzanie poprawności do interfejsu administracyjnego Przejdź do interfejsu administracyjnego i spróbuj wpisać wiadomość ze zbyt krótkim tematem. Uda si e, ale chcemy to zmienić. Zarejestruj model Message w interfejsie administracyjnym korzystajac z tak napisanej klasy MessageAdmin: 21

1 from gazetr.contact.forms import ContactForm 2 3 class MessageAdmin(admin.ModelAdmin): 4 form = ContactForm Spróbuj znowu wpisać w panelu administracyjnym niepoprawna wiadomość -- zostanie odrzucona. 4.5 Popraw wyglad strony kontaktowej Zmień stron e /kontakt/ tak, żeby korzysta la z ogólnej oprawy graficznej serwisu. 4.6 Dodaj do wszystkich stron list e kategorii Strona base.html ma dużo zaślepek -- miejsc, które trzeba uzupe lnić danymi. By loby bardzo niewygodne, gdyby trzeba by lo dopisywać pobieranie tych danych w każdym widoku, który (pośrednio) korzysta z tego szablonu; na szcz eście można to zrobić w jednym miejscu. Utwórz plik gazetr/context_processors.py: 1 from gazetr.news.models import Category 2 3 def gazetr_context(request): 4 return { 5 categories : Category.objects.all(), 6 } Otwórz plik django/conf/global_settings.py, znajdź w nim definicje TEMPLATE_CONTEXT_PROCESSORS i skopiuj ja na koniec gazetr/settings.py. Na końcu TEMPLATE_CONTEXT_PROCESSORS dodaj gazetr.context_processors.gazetr_context. Od teraz we wszystkich stronach utworzonych z użyciem RequestContext, w tym także stronach utworzonych przez widoki generyczne, dost epna b edzie zmienna categories. Zmień szablon base.html tak, żeby w cz eści Kategorie wyświetla l rzeczywisty spis kategorii razem z odsy laczami do ich stron. 4.7 Dodaj do wszystkich stron list e sponsorów Zmień gazetr_context tak, żeby do zmiennej advertisements wstawia l Advertisement.objects.all(). Zmień szablon base.html tak, żeby w cz eści Sponsorzy by ly widoczne rzeczywiste reklamy z odsy laczami z bazy danych. 4.8 Dodaj do wszystkich stron list e wpisów do menu Zmień gazetr_context tak, żeby do zmiennej menu_entries wstawia l MenuEntry.objects.all(). Zmień szablon base.html tak, żeby w menu wyświetla l wpisy z menu_entries. 22

4.9 Dodaj sprawdzanie poprawności danych, cz eść 2 Zmień ContactForm tak, żeby oprócz dotychczasowych warunków odrzuca l wiadomości, których: tekst zawiera mniej niż 10 znaków tytu l lub tekst zawiera dwa wykrzykniki pod rzad 4.10 Dodaj stron e dzi ekujemy za wiadomość Użytkownik po poprawnym wpisaniu formularza powinien zostać przekierowany nie na strone administracyjna, ale pod adres /kontakt/dziekujemy/. Zmień przekierowanie w contact_view. Dodaj do urls.py obs lug e tego adresu przez django.views.generic.simple.direct_to_template z parametrem template równym contact/thanks.html. Utwórz szablon contact/thanks.html dziedziczacy po base.html, z tekstem Dziekujemy za wys lanie wiadomości. 23

5 Strona g lówna, api bazodanowe Wszystkie dotychczasowe strony pobiera ly dane na jeden z dwóch sposobów: albo wszystkie instancje jakiegoś modelu, albo pojedyncza instancje wskazana przez numer identyfikacyjny (pole id). Strona g lówna różni sie od nich tym, że wyświetla dane zebrane w bardziej skomplikowany sposób. Sa to: 1. najnowszy artyku l oznaczony jako wiadomość dnia 2. trzy najnowsze artyku ly oznaczone jako wyróżnione 3. trzy najnowsze artyku ly bez oznaczeń wyróżnione albo spam Potrzebna b edzie wiedza interfejsie dost epu do bazy danych. 5.1 API bazy danych - wprowadzenie W tej chwili w bazie danych powinieneś mieć pieć kategorii, utworzonych zgodnie z punktem Utwórz potrzebne kategorie z cześci pierwszej. Sprawdź, czy wartości pól nazwa i w laściciel sa dok ladnie takie: Gospodarka, w laściciel: edytor 1 Kultura, w laściciel: edytor 1 Sport, w laściciel: edytor 1 Technika, w laściciel: admin Wydarzenia, w laściciel: admin W przeciwnym wypadku wyniki poleceń nie bed a sie zgadzać z podanymi w tym tekście. Uruchom konsol e poleceń manage.py: 1 $ python manage.py shell 2 Python 2.5.1 (r251:54863, Jul 31 2008, 23:17:40) 3 Type "copyright", "credits" or "license" for more information. 4 5 IPython 0.8.1 -- An enhanced Interactive Python. 6? -> Introduction to IPython s features. 7 %magic -> Information about IPython s magic % functions. 8 help -> Python s own help system. 9 object? -> Details about object.?object also works,?? prints more. 10 11 In [1]: Wyglad konsoli In [1]: jest znakiem zachety rozszerzonego interpretera Pythona. Jeśli po uruchomieniu shell pojawia sie standardowy, pythonowy znak zachety: >>>, to znaczy że na Twoim systemie nie jest zainstalowany pakiet ipython. Nie przeszkadza to w korzystaniu z Django. 24

W tym interpreterze wpisz polecenia: 1 In [1]: from gazetr.news.models import Category 2 3 In [2]: Category.objects.all() 4 Out[2]: [<Category: Gospodarka>, <Category: Kultura>, <Category: Sport>, 5 <Category: Technika>, <Category: Wydarzenia>] Category.objects to Manager modelu Category -- obiekt pozwalajacy na dostep do danych tego modelu w bazie. Metoda all, zgodnie z nazwa, pobiera wszystkie wpisy. Pobierz jedna kategorie: 1 In [3]: Category.objects.all()[1] 2 Out[3]: <Category: Kultura> W pythonie wyrażenie lista[0] oznacza pierwszy element listy, lista[1] -- drugi i tak dalej. Możesz też pobrać zakres: 1 In [4]: Category.objects.all()[1:3] 2 Out[4]: [<Category: Kultura>, <Category: Sport>] Wyrażenie lista[a:b] oznacza wszystkie elementy listy o indeksach a, a+1, a+2 aż do b-1. Sprawdź dane wybranej kategorii: 1 In [4]: a = Category.objects.all()[1] 2 3 In [5]: type(a) 4 Out[5]: <class gazetr.news.models.category > 5 6 In [6]: a.name 7 Out[6]: u Kultura 8 9 In [7]: a.owner 10 Out[7]: <User: edytor_1> 11 12 In [8]: a.owner.username 13 Out[8]: u edytor_1 14 15 In [9]: a.owner.is_staff 16 Out[9]: True To, co dostajesz w wyniku uruchomienia all() można pod wieloma wzgl edami traktować jak list e, ale nie jest to lista: 1 In [10]: type(category.objects.all()) 2 Out[10]: <class django.db.models.query.queryset > 25

Porównaj to z wynikiem polecenia type([]) i type(()). Obiekty klasy QuerySet to zapytania. Django pobierze kategorie z bazy danych dopiero kiedy bed a rzeczywiście potrzebne, na przyk lad kiedy zażadasz pojedynczego wpisu (jak wyżej, w poleceniu 4) albo spróbujesz QuerySet wypisać (jak w poleceniu drugim). Pozwala to na budowanie zapytań przez tworzenie kolejnych obiektów QuerySet: 1 In [1]: from django.contrib.auth.models import User 2 3 In [2]: qs1 = User.objects.all() 4 5 In [3]: qs2 = qs1.filter(is_staff=true) 6 7 In [4]: qs3 = qs2.filter(is_superuser=false) Sprawdź, których użytkowników pobiora te trzy zapytania. Co ważne: dopóki nie wyświetlisz zawartości którejś ze zmiennych qs, Django nie wyśle do bazy żadnego zapytania. Wyjaśnienie: qs1 to wynik dzia lania all, wi ec oznacza zapytanie o wszystkich użytkowników qs2 to wszyscy użytkownicy z qs1 majacy pole is_staff ( w zespole ) równe True qs3 to wszyscy użytkownicy z qs2 majacy pole is_superuser ( administrator ) równe False 5.2 Filtrowanie Sprawdź wyniki poleceń: 1 User.objects.filter(username= gosc ) 2 User.objects.filter(username= osc ) 3 User.objects.filter(username contains= osc ) 4 User.objects.filter(username= GOSC ) 5 User.objects.filter(username iexact= GOSC ) 6 User.objects.filter(is_staff=False) 7 8 u = User.objects.get(username= edytor_1 ) 9 Category.objects.filter(owner=u) Podwójne podkreślenie po raz pierwszy Pierwsze zastosowanie podwójnego podkreślenia: pozwala na podanie innych porównań niż zwyk le jest równe. username contains= osc oznacza username zawiera osc username iexact= GOSC oznacza username jest równe GOSC, ale bez zwracania uwagi na wielkość liter Ściaga z Django zawiera obszerniejsza liste rodzajów porównań. 26

Sprawdź wyniki poleceń: 1 User.objects.filter(is_staff=True) 2 User.objects.exclude(is_staff=True) 3 User.objects.filter(is_staff=True).filter(username contains= o ) 4 User.objects.filter(is_staff=True).exclude(username contains= o ) filter a exclude exclude dzia la jak filter, ale z odwrotnym warunkiem: w tym przyk ladzie exclude(is_staff=true) oznacza z wyjatkiem tych, którzy maja pole is_staff ustawione na True. Pobierz (sprawdzajac w interfejsie administratorskim, czy wynik jest w laściwy): wszystkich użytkowników majacych status administratora wszystkich użytkowników majacych dostep do panelu administracyjnego, ale bez statusu administratora wszystkich użytkowników majacych dostep do panelu administracyjnego, z wyjatkiem tych z edytor w nazwie wszystkie kategorie, których w laścicielem jest admin 5.3 Filtrowanie na podstawie pól modeli po l aczonych Sprawdź wyniki poleceń: 1 Category.objects.filter(owner username= admin ) 2 Category.objects.filter(owner is_staff=true) 3 Category.objects.filter(owner username= edytor ) 4 Category.objects.filter(owner username contains= edytor ) Podwójne podkreślenie po raz drugi Drugie zastosowanie podwójnego podkreślenia: pozwala na użycie do filtrowania pól z modeli powiazanych z obecnym, na przyk lad -- przy pomocy pola ForeignKey. W tym przyk ladzie: owner username= admin oznacza w laściciel kategorii ma login admin owner is_staff=true oznacza w laściciel kategorii ma status w zespole owner username contains= edytor l aczy oba zastosowania podwójnego podkreślenia i oznacza w laściciel kategorii ma status w zespole Pobierz (sprawdzajac w interfejsie administratorskim, czy wynik jest w laściwy): wszystkie artyku ly, których autorem jest edytor 1 wszystkie artyku ly z kategorii Wydarzenia wszystkie artyku ly ze wszystkich kategorii, których w laściciel ma ustawione pole is_superuser 27

5.4 Pobieranie pojedynczych obiektów Sprawdź wyniki poleceń: 1 User.objects.get(id=1) 2 User.objects.get(username= gosc ) 3 User.objects.get(username contains= osc ) 4 User.objects.get(is_staff=True) 5 User.objects.get(username= nieobecny ) Dwa z nich skończa sie b l edem. Dlaczego? Porównanie get i filter Metoda get przyjmuje takie same parametry jak filter, ale: wykonuje zapytanie natychmiast zak lada, że w wyniku zapytania otrzyma dok ladnie jeden obiekt zwraca pobrany z bazy obiekt, a nie nowy QuerySet Pobierz (sprawdzajac w interfejsie administratorskim, czy wynik jest w laściwy): kategori e o nazwie Wydarzenia kategorie o nazwie zawierajacej ech 5.5 Sortowanie wyników Sprawdź wyniki poleceń: 1 User.objects.all() 2 User.objects.order_by( -username ) 3 User.objects.order_by( is_staff ) 4 User.objects.order_by( is_staff, username ) 5 User.objects.order_by( is_staff, -username ) 6 User.objects.order_by(? ) Pobierz (sprawdzajac w interfejsie administratorskim, czy wynik jest w laściwy): pierwsza alfabetycznie kategorie ostatnia alfabetycznie kategorie najnowszy artyku l najnowszy artyku l z kategorii Wydarzenia najstarszy artyku l napisany przez użytkownika edytor 1 jeden losowo wybrany artyku ly z kategorii Technika 28

5.6 Uzupe lnij dane w bazie Strona g lówna wymaga odpowiedniej liczby artyku lów. Upewnij si e, że: masz po dwa artyku ly w każdej kategorii oba artyku ly w dziale Wydarzenia sa oznaczone jako Wiadomość dnia (lead_story), a jeden z nich dodatkowo jest wyróżniony featured pozosta le dzia ly zawieraja po jednym artykule wyróżnionym (featured) i jednym zwyk lym (ani lead_story, ani featured) 5.7 Napisz bazowy widok i szablon strony g lównej Dodaj do news/views.py funkcje index, najpierw w wersji przekazujacej do szablonu testowe teksty zamiast rzeczywistych wiadomości: 1 from django.shortcuts import render_to_response 2 from django.template import RequestContext 3 4 def index(request): 5 lead_story = "LEAD STORY" 6 featured_articles = ["FEATURED 1", "FEATURED 2", "FEATURED 3"] 7 normal_articles = ["NORMAL 1", "NORMAL 2", "NORMAL 3"] 8 9 return render_to_response( news/index.html, 10 context_instance = RequestContext(request), 11 dictionary = { 12 lead_story : lead_story, 13 featured_articles : featured_articles, 14 normal_articles : normal_articles, 15 }) Dopisz t e funkcj e do urls.py tak, żeby obs lugiwa la adres strony g lównej: r ^$. Otwórz w przegladarce strone g lówna; pojawi sie informacja o braku szablonu. Utwórz plik news/index.html w taki sposób, żeby wyświetla l wartości zmiennych lead_article, featured_articles i normal_articles Otwórz ponownie strone g lówna, powinny pojawić sie wartości z kodu. Zmień kod funkcji index tak, żeby poprawnie ustawia l wartości zmiennych: lead_article: na najnowszy artyku l z ustawionym lead_story featured_article: na liste trzech najnowszych artyku lów z ustawionym featured, zaczynajac od najnowszego normal_articles: na liste trzech najnowszych artyku lów bez lead_story i featured, zaczynajac od najnowszego Na stronie g lównej w miejscu tekstów tymczasowych powinny sie pojawić rzeczywiste wartości. Porównaj z panelem administracyjnym żeby sprawdzić, czy sa wyświetlane odpowiednie artyku ly. 29

5.8 Popraw wyglad strony g lównej Zmień szablon news/index.html tak, żeby pasowa l do oprawy graficznej ca lego serwisu. W katalogu z materia lami jest plik html/index_content.html. Skopiuj jego zawartość do bloku content szablonu news/index.html i zmień tak, żeby wyświetla l rzeczywiste wartości zamiast zaślepek. 5.9 Dodaj do wszystkich stron list e ostatnich wydarzeń Zmień gazetr_context tak, żeby do zmiennej events wstawia l cztery najnowsze artyku ly z dzia lu Wydarzenia. Zmień szablon base.html tak, żeby w dziale Wydarzenia wyświetla l wpisy z events. 5.10 Api bazy danych: zmiany wpisów Funkcje do obs lugi bazy nie kończa sie na pobieraniu danych. Sprawdź efekty poniższych poleceń w panelu administracyjnym. Artyku ly można zmieniać (sprawdź wyniki poleceń): 1 a = Article.objects.order_by( created )[0] 2 a.title = u Nowy tytul 3 a.save() 4 Article.objects.order_by( created )[0] tworzyć: 1 author = User.objects.all()[0] 2 category = Category.objects.get(name=u Wydarzenia ) 3 a = Article.objects.create(title=u Nowy artykul, category=category, author=author) 4 # sprawdz, czy sie udalo 5 Article.objects.filter(title=u Nowy artykul ) i usuwać (ostrożnie): 1 Article.objects.filter(title=u Nowy artykul ) 2 a = Article.objects.get(title=u Nowy artykul ) 3 a.delete() 4 Article.objects.filter(title=u Nowy artykul ) Zwróć uwag e: create zwraca już zapisany obiekt, nie trzeba na nim wywo lywać save. Wi ecej informacji Making queries : http://docs.djangoproject.com/en/dev/topics/db/queries/ QuerySet API reference : http://docs.djangoproject.com/en/dev/topics/db/queries/ Pola ForeignKey tworza po l aczenia miedzy obiektami w obie strony. Przyjrzyj sie atrybutowi article_set kategorii -- to także jest Manager, tylko ograniczony do artyku lów danej kategorii. Opis w Making queries, Following relationships backward. 30

6 Komentarze, strony statyczne 6.1 Dodaj aplikacje comments Dodaj do projektu aplikacje django.contrib.comments i utwórz jej tabele w bazie. Dodaj do urls.py linijke: 1 (r ^comments/, include( django.contrib.comments.urls )), Zajrzyj do interfejsu administracyjnego, upewnij si e że można otworzyć list e komentarzy. 6.2 Dodaj formularz komentarza do strony artyku lu Zmień szablon strony pojedynczego artyku lu w taki sposób: 1. na poczatku (ale po linii extends) dodaj {% load comments %} 2. w miejscu, w którym powinien pojawić si e formularz, wpisz {% render_comment_form for article %} Sprawdź jak teraz wyglada strona artyku lu. Dodaj komentarz. Przejdź do panelu administracyjnego, sprawdź czy pojawi l si e na liście. 6.3 Dostosuj strone podgladu komentarza Spróbuj dodać komentarz bez wype lniania żadnego pola. Widok obs lugujacy strone podgladu komentarza dla modelu Article z aplikacji news skorzysta z pierwszego szablonu znalezionego wed lug listy: 1. comments/news_article_preview.html 2. comments/news_preview.html 3. comments/preview.html Ten ostatni jest zdefiniowany w aplikacji comments, w pliku comments/preview.html. Nie trzeba go zmieniać, wystarczy do gazetr/templates dodać któryś z szablonów pasujacych do tej listy. Znajdź w aplikacji django.contrib.comments szablon comments/preview.html i skopiuj go do projektu gazetr jako comments/news_article_preview.html. Zmień comments/news_article_preview.html tak, żeby: dziedziczy l po base.html zamiast comments/base.html zawiera l w widocznym miejscu tekst Dodajesz komentarz do artyku lu: tytu l artyku lu ; komentowany obiekt jest dost epny w tym szablonie jako form.target_object Spróbuj ponownie dodać komentarz bez wpisywania żadnych danych. Powinna pojawić sie znowu strona podgladu, ale już w naszej szacie graficznej. 31

6.4 Popraw stron e Dzi ekujemy za komentarz Podobnie jak ze strona comments/preview.html, skopiuj do szablonów projektu strone comments/posted.html. Uwaga: ta strona nie korzysta już z konwencji z wstawianiem nazwy aplikacji i modelu do nazwy szablonu, wi ec nie zmieniaj nazwy. Zmień skopiowany szablon tak, żeby pojawi l sie z oprawa graficzna gazetr. Dodaj odsy lacz wróć z adresem pobranym z comment.content_object.get_absolute_url. Dodaj komentarz, sprawdź że odsy lacz przekierowuje z powrotem do komentowanego artyku lu. 6.5 Dodaj list e komentarzy W pliku news/article_detail.html dodaj linijke pobierajac a liczbe komentarzy dla obiektu article: 1 {% get_comment_count for article as comment_count %} Ten tag niczego nie wstawia do HTML, ale wstawia do zmiennej comment_count liczbe komentarzy wpisanych do obiektu article. Wykorzystaj te zmienna w odpowiednim miejscu news/article_detail.html. Sprawdź, czy po dodaniu komentarza ta liczba si e zmienia. Analogicznie, tag get_comment_list nie generuje żadnego HTML, ale wstawia do wskazanej zmiennej list e komentarzy: 1 {% get_comment_list for article as comment_list %} Dodaj t e lini e do news/article_detail.html i wykorzystaj comment_list do wyświetlenia listy komentarzy w odpowiednim miejscu. Sprawdź pod adresem /admin/doc/, jakie pola sa dostepne w obiektach modelu Comment. 6.6 Dodaj moderacj e Aplikacja comments udostepnia strone /comments/moderate/ z lista komentarzy oczekujacych na zaakceptowanie. Każdy komentarz ma dwa pola istotne dla moderacji: is_public - ustawiony na True oznacza, że komentarz przeszed l przez moderacj e is_removed - ustawiony na True oznacza, że komentarz zosta l odrzucony przez moderatora W kolejce na stronie /comments/moderate/ widać wszystkie komentarze, które maja oba te pola ustawione na False. Sprawdź: otwórz jeden z komentarzy w interfejsie administracyjnym i odznacz w nim oba te pola. Po zapisaniu zmian pojawi si e w kolejce komentarzy do sprawdzenia. Aplikacja comments domyślnie ustawia pole is_public na True, ale można to zmienić. Dodaj na końcu pliku contact/models.py kod: 32

1 from django.contrib.comments.signals import comment_will_be_posted 2 3 def moderate_comment(sender, comment, **kwargs): 4 comment.is_public = False 5 6 comment_will_be_posted.connect(moderate_comment) Ostatnia linia oznacza, że Django przed dodaniem komentarza wykona funkcj e moderate_comment. Dodaj teraz komentarz i sprawdź, że: nie pojawi l si e na stronie artyku lu w spisie komentarzy w interfejsie administracyjnym widać, że wartość pola is_public zosta la ustawiona na False pojawi l si e na stronie /comments/moderate/ Możesz go teraz odrzucić lub zaakceptować. 6.7 Rozbuduj funkcje moderujac a Zmień funkcj e moderate_comment tak, żeby: przepuszcza la bez konieczności moderacji komentarze wpisane przez zalogowanych użytkowników dodawa la do kolejki do moderacji komentarze wpisane przez anonimowych użytkowników automatycznie odrzuca la komentarze zawierajace podwójne wykrzykniki w treści Sprawdź, czy funkcja dzia la zgodnie z tymi warunkami. 6.8 Dodaj strony z informacjami o b l edach Spróbuj otworzyć w przegladarce artyku l o identyfikatorze, którego nie ma w bazie danych. Zobaczysz strone z numerem b l edu 404 i opisem No article found matching the query z dopiskiem, że widzisz ten opis tylko dlatego, że zmienna konfiguracyjna settings.debug jest ustawiona na True. Zmień ja na False, uruchom ponownie serwer i spróbuj otworzyć ten artyku l ponownie. Zobaczysz informacje o wyjatku TemplateDoesNotExist: 500.html -- wynika to stad, że mechanizm obs lugi b l edów Django: 1. spróbowa l wczytać i wyświetlić szablon odpowiedzialny za zawartość strony o b l edzie 404: 404.html; brak tego szablonu jest uznawany za b l ad serwisu, i powoduje zmiane statusu z 404 (nie znaleziono obiektu) na 500 (wewnetrzny b l ad serwera) 2. spróbowa l wczytać i wyświetlić szablon informujacy o b l edzie 500: 500.html. Tego również nie znalaz l. W tym samym czasie wys la l też do administratora mail z informacja o tym b l edzie. 3. wypisa l informacj e o b l edzie 500 w najprostszej możliwej postaci 33