Tworzenie pierwszej aplikacji Django, część 2

Autor oryginału: Adrian Holovaty <holovaty {} gmail // com>
Adres oryginału: www.djangoproject.com/documentation/tutorial2
Tłumaczenie: Marcin Sztolcman <marcin {} urzenia // net>

Ta część tutoriala zaczyna się w miejscu, w którym skończyła się część pierwsza. Będziemy kontynuować budowę aplikacji webowej - sondy - i skupimy się na automatycznie generowanym panelu administracyjnym.

Założenia

Generowanie panelu administracyjnego dla klientów aby mogli dodawać, edytować i usuwać treść jest żmudną pracą która nie wymaga zbyt dużej kreatywności. Z tego właśnie powodu Django stara się zautomatyzować tworzenie interfejsu administracyjnego.

Django był pisany w środowisku publicystów, gdzie bardzo ważnym było oddzielenie części zarządzającej stroną od publicznej. Osoby zarządzające stroną używają systemu aby dodawać nowe historie, wydarzenia, punktacje sportowe etc, a ta treść była wystawiana dla “publiki”. Django rozwiązuje problemy z tworzeniem zunifikowanych paneli administracyjnych do edycji treści.

Panel administracyjny nie jest przeznaczony do użytku przez osoby odwiedzające naszą stronę - jest dla osób zarządzających tą stroną.

Aktywacja panelu administracyjnego

Część administracyjna Django jest domyślnie wyłączona - można ją opcjonalnie włączyć. Aby to zrobić dla swojej instalacji, trzeba wykonać trzy kroki:

  • dodać “django.contrib.admin” do ustawień INSTALLED_APPS;
  • wykonać komendę django-admin.py install admin. To spowoduje utworzenie dodatkowych tablic w bazie danych.
  • poprawić plik myproject.urls i odkomentować linię znajdującą się pod linią “Uncomment this for admin:”. Ten plik jest plikiem konfiguracyjnym dla URLi Twojej strony - będziemy zgłębiać jego tajniki w następnej części tutoriala. Na tą chwilę wystarczy Ci wiedzieć, że rzutuje on adresy URL na Twoją aplikację.

Tworzenie konta użytkownika

Wykonaj poniższe polecenie aby stworzyć konto administracyjne Twoim panelu:

django-admin.py createsuperuser --settings=myproject.settings

Skrypt zapyta się Ciebie o nazwę użytkownika, adres e-mail oraz hasło (dwa razy).

Uruchomienie serwera testowego

Aby ułatwić niektóre rzeczy, Django dostarcza bazujący na bibliotece BaseHTTPServer (dołączanej do Pythona) serwer WWW. Spróbujmy uruchomić go i zacznijmy poznawanie panelu administracyjnego.

Uruchom poniższą komendę:

django-admin.py runserver --settings=myproject.settings

To spowoduje uruchomienie lokalnego serwera nasłuchującego domyślnie na porcie 8000. Jeśli chcesz zmienić port serwera, dodaj do ostatniego polecenia dodatkowy argument:

django-admin.py runserver 8080 --settigs=myproject.settings

Nie używaj wbudowanego w Django serwera w środowisku produkcyjnym. Jego przeznaczeniem jest tylko i wyłącznie pomoc podczas trakcie testów i pisania aplikacji.

Teraz uruchom przeglądarkę i przejdź do ‘podkatalogu’ /admin/ swojej lokalnej domeny - np. 127.0.0.1:8000/admin. Powinieneś zobaczyć ekran logowania:

Ekran logowania do panelu administracyjnego Django.

Panel administracyjny

Spróbuj teraz się zalogować. Powinieneś ujrzeć stronę główną panelu adminiatrcyjnego Django:

Strona główna panelu administracyjnego Django.

Początkowo powinieneś zobaczyć dwie części które możesz poddać edycji: grupy i użytkowników. To jest podstawowa funkcjonalność Django dostarczana domyślnie.

Modyfikacja sondy z poziomu admina

Ale gdzie jest nasza sonda? Nie ma jej przecież w panelu administracyjnym.

Trzeba zrobić jedną rzecz: ‘poinformować’ Django że nasz model polls.Poll powinien posiadać interfejs do zarządzania nim. Wyedytuj plik myproject/apps/polls/models/polls.py i dodaj tam klasę wewnętrzą META z atrybutem admin:

class Poll(meta.Model):
  # ...
  class META:
    admin = meta.Admin()

Klasa META zawiera wszystkie meta dane nie będące polami bazy danych o tym modelu.

Teraz przeładuj stronę administracyjną Django abyś mógł zobaczyć zmiany. Zwróć uwagę, że nie musiałeś restartować serwera Django - on sam zauważył, że zmieniły się ustawienia i przeładował kod.

Badanie funkcjonalności admina

Zauważ że model Poll posiada atrybut admin dzięki któremu Django wie, że ma wyświetlić go w panelu:

Strona główna admina Django, tym razem już z sondami.

Kliknij “Polls”. Jesteś teraz na wykazie wszystkich sond. Ta strona pokazuje wszystkie sondy znajdujące się w bazie danych i pozwala wybrać jedną z nich do edycji. Teraz znajduje się tam tylko “What’s up?” - czyli sonda którą utworzyliśmy w pierwszej części tutoriala:

Strona z listą zmian dla sond.

Kliknij “What’s up?” aby poddać ją edycji:

Formularz edycji dla sondy.

Rzeczy które warto zauważyć:

  • formularz został wygenerowany automatycznie na podstawie informacji z modelu sondy (Poll);
  • różnym rodzajom pól modelu (meta.DateTimeField, meta.CharField) odpowiadają różne kontrolki HTML. Każdy typ pola wie jak ma zostać wywietlony w panelu administracyjnym;
  • do każdego pola DateTimeField dodawane są dodatkowe przyciski. Dla daty jest to “Today” (”Dziś”) wraz z przyciskiem wyświetlającym okienko z mini kalendarzem, natomiast dla pola “Time” (”Czas”) są przypisane przyciski “Now” (”Teraz”) oraz drugi, służący do pokazania okienka z listą najczęściej używanych określeń czasu.

Dolna część strony daje kilka opcji:

  • Save - zapisuje zmiany i wraca do listy obiektów danego rodzaju;
  • Save and continue editing - zapisuje zmiany i przeładowuje stronę;
  • Save and add another - zapisuje zmiany i przenosi do nowego, pustego formularza odpowiedniego dla danego rodzaju obiektu;
  • Delete - wyświetla ekran potwierdzający usunięcie obiektu.

Zmień datę publikacji (”Date published”) sondy poprzez kliknięcie skrótów “Today” i “Now”. Następnie kliknij “Save and continue editing”. Teraz wybierz “History” (”Historia”) w prawym górnym rogu strony. Zobaczysz listę zmian dla tego obiektu dokonanych w panelu administracyjnym Django, wraz z datą i godziną zmiany oraz loginem osoby dokonującej tą zmianę:

Strona historii zmian obiektu sondy.

Dostosowywanie panelu administracyjnego

Take a few minutes to marvel at all the code you didn’t have to write.

Poprawmy go nieco. Możemy zmienić kolejność pól poprzez dodanie parametru field do meta.Admin:

admin = meta.Admin(
  fields = (
    (None, {'fields': ('pub_date', 'question')}),
  ),
)

To spowodowało przesunięcie pola “Pub date” na górę:

Zmienina została kolejność wyświetlania poszczególnych pól

Nie ma to większego znaczenia przy tylko dwóch polach, jednak dla formularzy z większą ilością pól ustawienie intuicyjnej kolejności jest ważne ze względów używalności takiego formularza.

A skoro już mówimy o formularzach z większą ilością pól, możesz chcieć je podzielić na zestawy:

admin = meta.Admin(
  fields = (
    (None, {'fields': ('question',)}),
    ('Date information', {'fields': ('pub_date',)}),
  ),
)

Pierwszym elementem w każdej tupli (krotce) w atrybucie fields jest nazwa zestawu. Teraz formularz wygląda tak:

Formularz został podzielony na zestawy pól.

Możesz przypisać do każdego zestawu konkretną klasę języka HTML. Django posiada wbudowaną obsługę klasy “collapse” która wyświetla wybrany zestaw pól jako początkowo zwinięte. Jest to użyteczne gdy mamy długi formularz z kilkoma polami które są rzadziej używane:

admin = meta.Admin(
  fields = (
    (None, {'fields': ('question',)}),
    ('Date information', {
      'fields': ('pub_date',), 'classes': 'collapse'}),
  ),
)

Zestawy pól są zwinięte.

Modyfikacja listy obiektów

Teraz, kiedy strony edycji i dodawania sondy wyglądają tak jak powinny, spróbujmy poprawić stronę z listą sond.

Tutaj możesz sprawdzić jak to wygląda obecnie:

Strona z listą sond panelu administracyjnego.

Domyślnie, Django pokazuje reprezentację repr() każdego obiektu. Oczywiście można to trochę dostosować, tak, żeby wyświetlał pożądane przez nas pola. Aby to zrobić, użyj opcji list_display, która jest krotką zawierającą nazwy pól do wyświetlenia jako kolumny na stronie z listą sond:

class Poll(meta.Model):
  # ...
  class META:
    admin = meta.Admin(
      # ...
      list_display = ('question', 'pub_date'),
    )

Dla sprawdzenia jak się sprawuje ta opcja, dodajmy tam naszą metodę was_published_today z pierwszej części tutoriala:

list_display = ('question', 'pub_date', 'was_published_today'),

Teraz nasza strona z listą sond wygląda tak:

Uaktualniona lista sond.

Możesz kliknąć na nagłówku każdej z kolumn aby posortować listę sond po określonym parametrze - nie dotyczy to koluny “was_published_today”, ponieważ sortowanie z użyciem własnych metod nie jest obsługiwane przez Django. Zauważ też że nagłówek kolumny dla pola was_published_today jest domyślnie nazwą danej metody (z podkreślnikami zamienionymi na spacje). Można to też zmienić poprzez dodanie atrybutu short_description dla danej metody:

def was_published_today(self):
  return self.pub_date.date() == datetime.date.today()
was_published_today.short_description = 'Published today?'

Teraz dodajmy kolejne usprawnienia do naszej listy: filtry (”Filters”). Dodaj następującą linię do Poll.admin:

list_filter = ['pub_date'],

To spowodowało pojawienie się panelu bocznego “Filter” który pozwala na filtrowanie listy sond po polu pub_date:

Uaktualniona lista sond - filtry.

Rodzaj wyświetlanych filtrów zależy od rodzaju pola po którym chcemy filtrować. Ponieważ pub_date jest polem typu DateTimeField, Django wie że potrzebne będą opcje “Any date” (”Każda data”), “Today” (”Dzisiaj”), “Past 7 days” (”Ostatnie siedem dni”), “This month” (”Ten miesiąc”), “This year” (”Ten rok”).

Zaczyna wyglądać coraz lepiej. Dodajmy możliwość wyszukiwania:

search_fields = ['question'],

Na górze strony pojawiło się teraz pole wyszukiwarki. Gdy zostanie tam wpisana jakaś fraza, Django przeszuka pola question. Możesz użyć tylu pól ile potrzebujesz - aczkolwiek pamiętaj, że Django używa tutaj kwerendy SQL LIKE, więc umieszczaj tu tylko te pola których potrzebujesz.

Na koniec, ponieważ nasza sonda posiada daty, powinniśmy pogrupować nasze sondy po tym właśnie polu. Dodaj poniższą linijkę:

date_hierarchy = 'pub_date',

Teraz na górze strony pojawiły się pola ułatwiające nawigację po dacie. Na samej górze pokazane są dostępne lata. Później miesiące i dni.

Pozostało mi jeszcze poinformować Ciebie, że lista sond jest automatycznie dzielona na strony mieszczące domyślnie do 50 obiektów. Stronicowanie listy sond, pole wyszukiwarki, filtry, grupowanie po datach i sortowanie po kolumnach wspópracują ze sobą tak jak tego oczekujesz.

Upiększanie panelu administracyjnego

Tak naprawdę, napisy “Django administration” i “example.com” na górze każdej strony są nieco mylące. To są tylko “wypełniacze”.

Bardzo łatwo jest je zmienić korzystając z systemu szablonów Django. Panel administracyjny Django jest tworzony przez samo Django, więc nic dziwnego że korzysta ze swojego własnego systemu szablonów.

Otwórz swój plik ustawień (myproject/settings.py) i spójrz na opcję TEMPLATE_DIRS. Jest to krotka, przechowywująca ścieżki do katalogów które Django ma sprawdzać w poszukiwaniu szablonów.

Domyślnie TEMPLATE_DIRS jest puste. Dodajmy tam linię aby poinformować Django gdzie ma szukać szablonów:

TEMPLATE_DIRS = (
  "/home/mytemplates", # Dopasuj tą linię do swoich potrzeb.
)

Skopiuj teraz plik admin/base_site.html z domyślnego katalogu szablonów Django (django/contrib/admin/templates) do podkatalogu admin w którymkolwiek z katalogów które ustawiłeś w TEMPLATE_DIRS. Na przykład jeśli umieściłeś w TEMPLATE_DIRS linijkę /home/mytemplates, jak powyżej, to skopiuj django/contrib/admin/templates/admin/base_site.html do katalogu /home/mytemplates/admin/base_site.html.

Teraz wystarczy wyedytować skopiowany plik zastępując domyślne teksty Django swoimi.

Zauważ, że każdy domyślny szablon Django może zostać nadpisany. Aby to zrobić, zrób dokładnie to samo co zrobiłeś przed chwilą z base_site.html - skopiuj go z domyślnego katalogu do swojego, i wykonaj zmiany.

Uważni czytelnicy mogą zapytać: ale jeśli TEMPLATE_DIRS był domyślnie pusty, jak Django wyszukiwał domyślne szablony do panelu administracyjnego ? Odpowiedź: domyślnie, Django automatycznie szuka w podkatalogu templates/ każdej aplikacji. Zajrzyj do loader types documentation żeby dowiedzieś się więcej.

Zmiana wyglądu listy projektów

Kontynuując temat zmian wyglądu, możesz także dostosować dla siebie stronę z listą dostępnych aplikacji (indeks) panelu administracyjnego.

Domyślnie pokazywane są wszystkie dostępne aplikacje, zgodnie z Twoimi ustawieniami INSTALLED_APPS. Ale kolejność, w jakiej są wyświetlane, jest losowa, a Ty możesz sobie zażyczyć konkretnego wyglądu tejże strony. Poza tym, indeks jest prawdopodobnie najważniejszą częścią panelu, więc powinien być prosty w użyciu.

Szablon który tutaj użyjemy to admin/index.html (wykonaj te same czynności co przy admin/base_site.html w poprzedniej sekcji - skopiuj go z katalogu domyślnego do swojego). Następnie wyedytuj ten plik - zobaczysz że jest w nim użyty tag {% get_admin_app_list as app_list %}. Jest to coś, co zwraca listę zainstalowanych aplikacji Django. Zamiast używać tego taga, możesz wstawić “na sztywno” odnośniki do konkretnych stron panelu odpowiedzialnych za konkretne obiekty - i ułożyć je tak jak uważasz że będzie najlepiej.

Django pozwala też na użycie pewnego skrótu w tym temacie. Wykonaj polecenie django-admin.py adminindex polls aby dostać cały kod szablonu który należy umieścić w szablonie indeksu. Jest to na początku bardzo przydatne.

Aby dowiedzieć się więcej o dostosowywaniu wyglądu panelu administracyjnego Django, zajrzyj na Django admin CSS guide.

Kiedy już poznasz panel administracyjny Django, przeczytaj trzecią część tego tutoriala aby zacząć tworzyć publicznie widoczną stronę aplikacji.


Liczba komentarzy: 4

  1. 1 Był wtorek, 04 lipiec 2006 roku gdy o godzinie 11:04 przyszedł Art Koszulki - RICKY i stwierdził:

    OK

  2. 2 Była sobota, 31 marzec 2007 roku gdy o godzinie 05:49 przyszedł myGeeBlog » Blog Archive » [art]Django tutorial, część 1 i stwierdził:

    [...] poznasz już bardzo dobrze powyższe API, przystąp do drugiej części kursu aby uruchomić automatyczny panel administracyjny [...]

  3. 3 Była sobota, 31 marzec 2007 roku gdy o godzinie 06:11 przyszedł myGeeBlog » Blog Archive » [art]Django tutorial, część 3 i stwierdził:

    [...] część tutoriala zaczyna się w miejscu, w którym skończyła się część druga. Będziemy kontynuować budowę aplikacji webowej - sondy - i skupimy się na tworzeniu interfejsu [...]

  4. 4 Był wtorek, 25 wrzesień 2007 roku gdy o godzinie 11:03 przyszedł myGeeBlog » Blog Archive » Znów ten tutorial do Django… i stwierdził:

    [...] część 2 [...]

A Ty? Co o tym myślisz?

Możesz używać w komentarzach następujących znaczników:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sblam! Antyspam