Changeset 50
- Timestamp:
- 04/26/08 12:01:17 (6 months ago)
- Files:
-
- django-docs/tutorial02.txt (modified) (28 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django-docs/tutorial02.txt
r47 r50 3 3 =========================================== 4 4 Tłumaczenie: Marcin Sztolcman <marcin {} urzenia // net> 5 5 6 Poprawki: Maciej Litwiniuk <maciej // litwiniuk {} galdomedia // pl> 6 7 … … 13 14 14 15 .. admonition:: Założenia 15 16 16 17 Generowanie panelu administracyjnego dla klientów aby mogli dodawać, edytować i 17 18 usuwać treść jest żmudną pracą która nie wymaga zbyt dużej kreatywności. Z tego 18 właśnie powodu Django stara się zautomatyzować tworzenie interfejsu 19 właśnie powodu Django stara się zautomatyzować tworzenie interfejsu 19 20 administracyjnego. 20 21 21 Django był pisany w środowisku publicystów, gdzie bardzo ważnym było oddzielenie 22 części zarządzającej stroną od publicznej. Osoby zarządzające stroną używają 23 systemu aby dodawać nowe historie, wydarzenia, punktacje sportowe etc, a treść 24 ta była prezentowana czytelnikom. Django rozwiązuje problemy z związane 22 Django był pisany w środowisku publicystów, gdzie bardzo ważnym było oddzielenie 23 części zarządzającej stroną od publicznej. Osoby zarządzające stroną używają 24 systemu aby dodawać nowe historie, wydarzenia, punktacje sportowe etc, a treść 25 ta była prezentowana czytelnikom. Django rozwiązuje problemy z związane 25 26 tworzeniem uniwersalnych paneli administracyjnych na potrzeby edycji treści. 26 27 27 Panel administracyjny nie jest przeznaczony do użytku przez osoby odwiedzające 28 Panel administracyjny nie jest przeznaczony do użytku przez osoby odwiedzające 28 29 naszą stronę - jest dla osób zarządzających tą stroną. 29 30 … … 32 33 33 34 Część administracyjna Django jest domyślnie wyłączona - można ją opcjonalnie włączyć. 34 Aby aktywować int rfejs administracyjny dla swojej instalacji, trzeba wykonać trzy35 Aby aktywować interfejs administracyjny dla swojej instalacji, trzeba wykonać trzy 35 36 kroki: 36 37 … … 39 40 ``INSTALLED_APPS``, tabele w bazie danych muszą zostać uaktualnione. 40 41 * Popraw swój plik ``mysite/urls.py`` oraz odkomentuj linię znajdującą się pod 41 "Uncomment this for admin:". Ten plik jest plikiem konfiguracyjnym dla URLi 42 Twojej strony - będziemy zgłębiać jego tajniki w następnej części tutoriala. 42 "Uncomment this for admin:". Ten plik jest plikiem konfiguracyjnym dla URLi 43 Twojej strony - będziemy zgłębiać jego tajniki w następnej części tutoriala. 43 44 Na tą chwilę wystarczy Ci wiedzieć, że rzutuje on adresy URL na Twoją aplikację. 44 45 … … 48 49 Uruchommy serwer deweloperski i przyjrzyjmy się stronie administracyjnej. 49 50 50 Przypomnij sobie z części pier szej, że serwer deweloperski uruchamiałeś poleceniem:51 Przypomnij sobie z części pierwszej, że serwer deweloperski uruchamiałeś poleceniem:: 51 52 52 53 python manage.py runserver 53 54 54 Teraz otwó z przeglądarkę internetową i przejdź do "/admin/" w swojej lokalnej55 Teraz otwórz przeglądarkę internetową i przejdź do "/admin/" w swojej lokalnej 55 56 domenie -- np. http://127.0.0.1:8000/admin/. Powinienneś zoaczyć ekran logowania 56 57 do aplikacji administracyjnej. … … 69 70 :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin02.png 70 71 71 Powinien neś zobaczyć również kilk innycgtypów edytowalnych treści, w tym grupy,72 użytkowników oraz strony. To jest podstawowa funkcjonalność, którą Django 72 Powinieneś zobaczyć również kilka innych typów edytowalnych treści, w tym grupy, 73 użytkowników oraz strony. To jest podstawowa funkcjonalność, którą Django 73 74 dostarczana domyślnie. 74 75 … … 80 81 Ale gdzie jest nasza sonda? Nie ma jej przecież w panelu administracyjnym. 81 82 82 Trzeba zrobić jedną rzecz: "poinformować" ’"Django że nasz model ``polls.Poll``83 powinien posiadać interfejs do zarządzania nim. Wyedytuj plik 84 ``mysite/polls/models.py`` i dodaj tam klasę wewnętrz ą ``Admin``::83 Trzeba zrobić jedną rzecz: "poinformować" Django że nasz model ``polls.Poll`` 84 powinien posiadać interfejs do zarządzania nim. Wyedytuj plik 85 ``mysite/polls/models.py`` i dodaj tam klasę wewnętrzną ``Admin``:: 85 86 86 87 class Poll(models.Model): … … 90 91 91 92 Sekcja ``class Admin`` będzie zawierać wszystkie ustawienia związane ze sposobem 92 w jaki ten model będzie preze towany w panelu admina. Wszystkie ustawienia są93 w jaki ten model będzie prezentowany w panelu admina. Wszystkie ustawienia są 93 94 opcjonalne, jednak dodanie pustej klasy oznacza "dodaj ten obiekt do panelu 94 administracyjnego z użyciem domyślnych opcji" 95 administracyjnego z użyciem domyślnych opcji". 95 96 96 97 Teraz odśwież stronę panelu, by zobaczyć zmiany. Zauważ, że nie musiałeś 97 ponownie uruch amiaśserwera deweloperskiego -- serwer automatycznie przeładuje98 ponownie uruchomić serwera deweloperskiego -- serwer automatycznie przeładuje 98 99 projekt, więc wszelkie zmiany będą od razu widoczne w twej przeglądarce. 99 100 … … 101 102 ============================== 102 103 103 Teraz, gdy model ``Poll`` posiada wewnętrzną klasę ``Admin``, Django wie, że ma 104 Teraz, gdy model ``Poll`` posiada wewnętrzną klasę ``Admin``, Django wie, że ma 104 105 wyświetlić go w panelu: 105 106 … … 108 109 :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin03.png 109 110 110 Kliknij "Polls". Jesteś teraz na wykazie wszystkich sond. Ta strona pokazuje 111 Kliknij "Polls". Jesteś teraz na wykazie wszystkich sond. Ta strona pokazuje 111 112 wszystkie sondy znajdujące się w bazie danych i pozwala wybrać jedną z nich do 112 edycji. Teraz znajduje się tam tylko “What’s up?”- czyli sonda którą utworzyliśmy113 edycji. Teraz znajduje się tam tylko "What’s up?" - czyli sonda którą utworzyliśmy 113 114 w pierwszej części tutoriala: 114 115 … … 125 126 Rzeczy które warto zauważyć: 126 127 127 * Formularz został wygenerowany automatycznie na podstawie informacji z modelu 128 * Formularz został wygenerowany automatycznie na podstawie informacji z modelu 128 129 sondy 129 * różnym rodzajom pól modelu (model.DateTimeField, model.CharField) odpowiadają 130 różne kontrolki HTML. Każdy typ pola wie jak ma zostać wy wietlony w panelu130 * różnym rodzajom pól modelu (model.DateTimeField, model.CharField) odpowiadają 131 różne kontrolki HTML. Każdy typ pola wie jak ma zostać wyświetlony w panelu 131 132 administracyjnym 132 * do każdego pola ``DateTimeField`` dodawane są dodatkowe przyciski. Dla daty 133 jest to "Today" ("Dzisiaj") wraz z przyciskiem wyświetlającym okienko z mini 134 kalendarzem, natomiast dla pola "Time" ("Czas") są przypisane przyciski 133 * do każdego pola ``DateTimeField`` dodawane są dodatkowe przyciski. Dla daty 134 jest to "Today" ("Dzisiaj") wraz z przyciskiem wyświetlającym okienko z mini 135 kalendarzem, natomiast dla pola "Time" ("Czas") są przypisane przyciski 135 136 "Now" ("Teraz") oraz drugi, służący do pokazania okienka z listą najczęściej 136 137 używanych określeń czasu. … … 139 140 140 141 * Save (Zapisz) -- zapisuje zmiany i wraca do listy obiektów danego rodzaju. 141 * Save and continue editing (Zapisz i kontynuuj edycję) -- zapisuje zmiany i 142 * Save and continue editing (Zapisz i kontynuuj edycję) -- zapisuje zmiany i 142 143 przeładowuje stronę dla tego obiektu 143 * Save and add another (Zapisz i dodaj nowe) -- zapisuje zmiany i przenosi do 144 * Save and add another (Zapisz i dodaj nowe) -- zapisuje zmiany i przenosi do 144 145 nowego, pustego formularza odpowiedniego dla danego rodzaju obiektu. 145 146 * Delete (Usuń) -- wyświetla ekran potwierdzający usunięcie obiektu. 146 147 147 Zmień datę publikacji ("Date published") sondy poprzez kliknięcie skrótów 148 "Today" ("Dzisiaj") i "Now" ("Teraz"). Następnie kliknij "Save and continue 148 Zmień datę publikacji ("Date published") sondy poprzez kliknięcie skrótów 149 "Today" ("Dzisiaj") i "Now" ("Teraz"). Następnie kliknij "Save and continue 149 150 editing" ("Zapisz i kontynuuj edycję"). Teraz wybierz "History" ("Historia") 150 151 w prawym górnym rogu strony. Zobaczysz listę zmian dla tego obiektu dokonanych 151 w panelu administracyjnym Django, wraz z datą i godziną zmiany oraz loginem 152 w panelu administracyjnym Django, wraz z datą i godziną zmiany oraz loginem 152 153 osoby dokonującej tą zmianę: 153 154 … … 161 162 Poświęć kilka minut na podziwianie kodu, którego wcale nnie musisz pisać. 162 163 163 Poprawmy go nieco. Możemy zmienić kolejność pól poprzez dodanie parametru 164 Poprawmy go nieco. Możemy zmienić kolejność pól poprzez dodanie parametru 164 165 ``fields`` do klasy ``Admin``:: 165 166 … … 178 179 używalności takiego formularza. 179 180 180 A skoro już mówimy o formularzach z większą ilością pól, możesz chcieć je 181 A skoro już mówimy o formularzach z większą ilością pól, możesz chcieć je 181 182 podzielić na zestawy:: 182 183 … … 216 217 Jeszcze. 217 218 218 Są 2 sposoby na naprawienie tego problemu. Pierwszym jest dodanie modelowi 219 ``Choice`` jego własnej klasy Admin, tak samo jak zrobiliśmy to z modelem 219 Są 2 sposoby na naprawienie tego problemu. Pierwszym jest dodanie modelowi 220 ``Choice`` jego własnej klasy Admin, tak samo jak zrobiliśmy to z modelem 220 221 ``Polls``. Tak by to wyglądało:: 221 222 … … 231 232 :alt: Strona administracyjna dla odpowiedzi 232 233 233 W powyższym formularzu pole "Poll" jest polem wyboru zawierającym wszystkie 234 sondy w bazie. Django wie, że pole ``ForeignKey`` powinno być reprezentowane 235 w panelu administracyjnym jako pole ``<select>``. W naszym przypadku tylko 234 W powyższym formularzu pole "Poll" jest polem wyboru zawierającym wszystkie 235 sondy w bazie. Django wie, że pole ``ForeignKey`` powinno być reprezentowane 236 w panelu administracyjnym jako pole ``<select>``. W naszym przypadku tylko 236 237 jedna sonda chwilowo została zapisana. 237 238 238 Zwróć uwagę na odnośnik "Add another" ("Dodaj inną") znajdujący się obok pola 239 "Poll". Każdy obiekt powiązany kluczem obcym (ForeignKey) z innym obiektem 240 dostaje taki link automatycznie. Jeśli klikniesz "Add another", zobaczysz 241 okienko (popup) z formularzem do dodawania sond. Jeśli dodasz nową sondę za 239 Zwróć uwagę na odnośnik "Add another" ("Dodaj inną") znajdujący się obok pola 240 "Poll". Każdy obiekt powiązany kluczem obcym (ForeignKey) z innym obiektem 241 dostaje taki link automatycznie. Jeśli klikniesz "Add another", zobaczysz 242 okienko (popup) z formularzem do dodawania sond. Jeśli dodasz nową sondę za 242 243 pomocą tego okienka i klikniesz "Save", Django zapisze nową sondę w bazie danych 243 244 oraz uaktualni pole wyboru znajdujące się w formularzu odpowiedzi ("Choice"). 244 245 245 Powyższy sposób nie jest najbardziej efektywną metodą dodawania obiektów 246 Powyższy sposób nie jest najbardziej efektywną metodą dodawania obiektów 246 247 odpowiedzi do systemu. Byłoby wygodniej, jeśli mógłbyś dodawać odpowiedzi 247 248 do sondy bezpośrednio z formularza w którym tworzysz nową sondę. Skoro tak, 248 249 to spróbujmy to wykonać. 249 250 250 Usuń klasę ``Admin`` z modelu Choice. Następnie zmień pole klucza obcego w 251 Usuń klasę ``Admin`` z modelu Choice. Następnie zmień pole klucza obcego w 251 252 obiekcie Choice:: 252 253 253 254 poll = models.ForeignKey(Poll, edit_inline=models.STACKED, num_in_admin=3) 254 255 255 Powyższa zmiana informuje Django: "Obiekty odpowiedzi są edytowane z poziomu 256 Powyższa zmiana informuje Django: "Obiekty odpowiedzi są edytowane z poziomu 256 257 formularza sond. Domyślnie dostarcz 3 zestawy pól odpowiedzi." 257 258 … … 261 262 votes = models.IntegerField(core=True) 262 263 263 To mówi Django: "Kiedy edytujesz odpowiedzi w formularzu edycji sondy, pola 264 To mówi Django: "Kiedy edytujesz odpowiedzi w formularzu edycji sondy, pola 264 265 ‘choice’ i ‘votes’ są wymagane. Wypełnienie któregokolwiek z nich oznacza, 265 że ma zostać dodany nowy obiekt odpowiedzi, a wyczyszczenie obydwóch pól 266 że ma zostać dodany nowy obiekt odpowiedzi, a wyczyszczenie obydwóch pól 266 267 oznacza usunięcie istniejącego obiektu." 267 268 … … 279 280 użyć parametru ``num_extra_on_change=3``. 280 281 281 Jest tylko jeden mały problem: wyświetlenie wszystkich powiązanych wpisów 282 zabiera mnóstwo miejsca na ekranie. Z tego powodu, Django pozwala na inny 282 Jest tylko jeden mały problem: wyświetlenie wszystkich powiązanych wpisów 283 zabiera mnóstwo miejsca na ekranie. Z tego powodu, Django pozwala na inny 283 284 sposób wyświetlenia wewnętrznie powiązanych obiektów:: 284 285 … … 294 295 ========================== 295 296 296 Teraz, kiedy strony edycji i dodawania sondy wyglądają tak jak powinny, 297 Teraz, kiedy strony edycji i dodawania sondy wyglądają tak jak powinny, 297 298 spróbujmy poprawić stronę z listą sond. 298 299 299 Tak to wygląda obecnie: :300 Tak to wygląda obecnie: 300 301 301 302 .. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin04t.png … … 303 304 :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin04.png 304 305 305 Domyślnie, Django pokazuje reprezentację ``str()`` każdego obiektu. Oczywiście 306 można to trochę dostosować, tak, żeby wyświetlał pożądane przez nas pola. 307 Aby to zrobić, użyj opcji ``list_display``, która jest krotką zawierającą nazwy 306 Domyślnie, Django pokazuje reprezentację ``str()`` każdego obiektu. Oczywiście 307 można to trochę dostosować, tak, żeby wyświetlał pożądane przez nas pola. 308 Aby to zrobić, użyj opcji ``list_display``, która jest krotką zawierającą nazwy 308 309 pól do wyświetlenia jako kolumny na stronie z listą sond:: 309 310 … … 314 315 list_display = ('question', 'pub_date') 315 316 316 Dla sprawdzenia jak się sprawuje ta opcja, dodajmy tam naszą metodę 317 Dla sprawdzenia jak się sprawuje ta opcja, dodajmy tam naszą metodę 317 318 ``was_published_today`` z pierwszej części tutoriala:: 318 319 … … 325 326 :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin13.png 326 327 327 Możesz kliknąć na nagłówku każdej z kolumn aby posortować listę sond po 328 określonym parametrze -- nie dotyczy to koluny ``was_published_today``, 328 Możesz kliknąć na nagłówku każdej z kolumn aby posortować listę sond po 329 określonym parametrze -- nie dotyczy to koluny ``was_published_today``, 329 330 ponieważ sortowanie z użyciem własnych metod nie jest obsługiwane przez Django. 330 Zauważ też że nagłówek kolumny dla pola ``was_published_today`` jest domyślnie 331 Zauważ też że nagłówek kolumny dla pola ``was_published_today`` jest domyślnie 331 332 nazwą danej metody (z podkreślnikami zamienionymi na spacje). 332 333 Można to też zmienić poprzez dodanie atrybutu ``short_description`` dla danej … … 338 339 339 340 340 Teraz dodajmy kolejne usprawnienia do naszej listy: filtry ("Filters"). Dodaj 341 Teraz dodajmy kolejne usprawnienia do naszej listy: filtry ("Filters"). Dodaj 341 342 następującą linię do ``Poll.Admin``:: 342 343 343 344 list_filter = ['pub_date'] 344 345 345 To spowodowało pojawienie się panelu bocznego "Filter" który pozwala na 346 To spowodowało pojawienie się panelu bocznego "Filter" który pozwala na 346 347 filtrowanie listy sond po polu ``pub_date``: 347 348 … … 352 353 Rodzaj wyświetlanych filtrów zależy od rodzaju pola po którym chcemy filtrować. 353 354 Ponieważ ``pub_date`` jest polem typu DateTimeField, Django wie że potrzebne 354 będą opcje "Any date" ("Każda data"), "Today" ("Dzisiaj"), "Past 7 days" 355 będą opcje "Any date" ("Każda data"), "Today" ("Dzisiaj"), "Past 7 days" 355 356 ("Ostatnie 7 dni"), "This month" ("Ten miesiąc"), "This year" ("Ten rok"). 356 357 … … 369 370 date_hierarchy = 'pub_date' 370 371 371 Teraz na górze strony pojawiły się pola ułatwiające nawigację po dacie. Na 372 Teraz na górze strony pojawiły się pola ułatwiające nawigację po dacie. Na 372 373 samej górze pokazane są dostępne lata. Później miesiące i dni. 373 374 374 Pozostało mi jeszcze poinformować Ciebie, że lista sond jest automatycznie 375 Pozostało mi jeszcze poinformować Ciebie, że lista sond jest automatycznie 375 376 dzielona na strony mieszczące domyślnie do 50 obiektów. Stronicowanie listy 376 377 sond, pole wyszukiwarki, filtry, grupowanie po datach i sortowanie po kolumnach … … 378 379 379 380 Upiększanie panelu administracyjnego 380 ================================= 381 ==================================== 381 382 382 383 Tak naprawdę, napis "Django administration" na górze każdej strony jest nieco … … 391 392 Django ma sprawdzać w poszukiwaniu szablonów. 392 393 393 Domyślnie ``TEMPLATE_DIRS`` jest puste. Dodajmy tam linię aby poinformować 394 Domyślnie ``TEMPLATE_DIRS`` jest puste. Dodajmy tam linię aby poinformować 394 395 Django gdzie ma szukać szablonów:: 395 396 … … 398 399 ) 399 400 400 Skopiuj teraz plik ``admin/base_site.html`` z domyślnego katalogu szablonów 401 Skopiuj teraz plik ``admin/base_site.html`` z domyślnego katalogu szablonów 401 402 Django (``django/contrib/admin/templates``) do podkatalogu admin w którymkolwiek 402 403 z katalogów które ustawiłeś w ``TEMPLATE_DIRS``. Na przykład jeśli umieściłeś 403 w ``TEMPLATE_DIRS`` linijkę ``/home/my_username/mytemplates``, jak powyżej, 404 to skopiuj ``django/contrib/admin/templates/admin/base_site.html`` do 404 w ``TEMPLATE_DIRS`` linijkę ``/home/my_username/mytemplates``, jak powyżej, 405 to skopiuj ``django/contrib/admin/templates/admin/base_site.html`` do 405 406 katalogu ``/home/my_username/mytemplates/admin/base_site.html``. Nie zapomnij 406 407 o tym podkatalogu ``admin``. 407 408 408 Teraz wystarczy wyedytować skopiowany plik zastępując domyślne teksty Django 409 Teraz wystarczy wyedytować skopiowany plik zastępując domyślne teksty Django 409 410 swoimi. 410 411 411 412 Zauważ, że każdy domyślny szablon Django może zostać nadpisany. Aby to zrobić, 412 zrób dokładnie to samo co zrobiłeś przed chwilą z ``base_site.html`` -- 413 zrób dokładnie to samo co zrobiłeś przed chwilą z ``base_site.html`` -- 413 414 skopiuj go z domyślnego katalogu do swojego, i wykonaj zmiany. 414 415 415 Uważni czytelnicy mogą zapytać: skoro ``TEMPLATE_DIRS`` był domyślnie pusty, 416 jak Django wyszukiwał domyślne szablony do panelu administracyjnego ? 416 Uważni czytelnicy mogą zapytać: skoro ``TEMPLATE_DIRS`` był domyślnie pusty, 417 jak Django wyszukiwał domyślne szablony do panelu administracyjnego ? 417 418 Odpowiedź: domyślnie, Django automatycznie szuka w podkatalogu ``templates/`` 418 każdej aplikacji. Zajrzyj do `loader types documentation `_, żeby dowiedzieś419 każdej aplikacji. Zajrzyj do `loader types documentation (en)`_, żeby dowiedzieć 419 420 się więcej. 420 421 421 .. _loader types documentation : ../templates_python/#loader-types422 .. _loader types documentation (en): http://djangoproject.com/documentation/templates_python/#loader-types 422 423 423 424 Zmiana wyglądu listy projektów 424 425 ============================== 425 426 426 Kontynuując temat zmian wyglądu, możesz także dostosować dla siebie stronę z 427 Kontynuując temat zmian wyglądu, możesz także dostosować dla siebie stronę z 427 428 listą dostępnych aplikacji (indeks) panelu administracyjnego. 428 429 429 Domyślnie pokazywane są wszystkie dostępne aplikacje, zgodnie z Twoimi 430 ustawieniami ``INSTALLED_APPS``. Ale kolejność, w jakiej są wyświetlane, jest 431 losowa, a Ty możesz sobie zażyczyć konkretnego wyglądu tejże strony. Poza tym, 432 indeks jest prawdopodobnie najważniejszą częścią panelu, więc powinien być 430 Domyślnie pokazywane są wszystkie dostępne aplikacje, zgodnie z Twoimi 431 ustawieniami ``INSTALLED_APPS``. Ale kolejność, w jakiej są wyświetlane, jest 432 losowa, a Ty możesz sobie zażyczyć konkretnego wyglądu tejże strony. Poza tym, 433 indeks jest prawdopodobnie najważniejszą częścią panelu, więc powinien być 433 434 prosty w użyciu. 434 435 435 Szablon który tutaj użyjemy to ``admin/index.html`` (wykonaj te same czynności 436 co przy ``admin/base_site.html`` w poprzedniej sekcji - -skopiuj go z katalogu437 domyślnego do swojego). Następnie wyedytuj ten plik -`zobaczysz że jest w nim438 użyty tag ``{% get_admin_app_list as app_list %}``. Jest to ten magiczny 439 element, który zwraca listę zainstalowanych aplikacji Django. Zamiast używać 440 tego taga, możesz wstawić "na sztywno" odnośniki do konkretnych stron panelu 436 Szablon który tutaj użyjemy to ``admin/index.html`` (wykonaj te same czynności 437 co przy ``admin/base_site.html`` w poprzedniej sekcji -- skopiuj go z katalogu 438 domyślnego do swojego). Następnie otwórz ten plik - zobaczysz że jest w nim 439 użyty tag ``{% get_admin_app_list as app_list %}``. Jest to ten magiczny 440 element, który zwraca listę zainstalowanych aplikacji Django. Zamiast używać 441 tego taga, możesz wstawić "na sztywno" odnośniki do konkretnych stron panelu 441 442 odpowiedzialnych za konkretne obiekty - i ułożyć je tak jak uważasz, że będzie 442 443 najlepiej. 443 444 444 445 Django pozwala też na użycie pewnego skrótu w tym temacie. Wykonaj polecenie 445 ``python django-admin.py adminindex polls``, aby dostać cały kod szablonu 446 ``python django-admin.py adminindex polls``, aby dostać cały kod szablonu 446 447 który należy umieścić w szablonie indeksu. Jest to na początku bardzo przydatne. 447 448 448 Aby dowiedzieć się więcej o dostosowywaniu wyglądu panelu administracyjnego 449 Django, zajrzyj na `Django admin CSS guide `_.450 451 Kiedy już poznasz panel administracyjny Django, przeczytaj 449 Aby dowiedzieć się więcej o dostosowywaniu wyglądu panelu administracyjnego 450 Django, zajrzyj na `Django admin CSS guide (en)`_. 451 452 Kiedy już poznasz panel administracyjny Django, przeczytaj 452 453 `trzecią część tego tutoriala`_ aby zacząć tworzyć publicznie widoczną stronę 453 454 aplikacji. 454 455 455 .. _Django admin CSS guide : ../admin_css/456 .. _Django admin CSS guide (eN): http://djangoproject.com/documentation/admin_css/ 456 457 .. _trzecią część tego tutoriala: ../tutorial03/