| 1 | | ===================================== |
|---|
| 2 | | Writing your first Django app, part 2 |
|---|
| 3 | | ===================================== |
|---|
| 4 | | |
|---|
| 5 | | This tutorial begins where `Tutorial 1`_ left off. We're continuing the Web-poll |
|---|
| 6 | | application and will focus on Django's automatically-generated admin site. |
|---|
| 7 | | |
|---|
| 8 | | .. _Tutorial 1: ../tutorial01/ |
|---|
| 9 | | |
|---|
| 10 | | .. admonition:: Philosophy |
|---|
| 11 | | |
|---|
| 12 | | Generating admin sites for your staff or clients to add, change and delete |
|---|
| 13 | | content is tedious work that doesn't require much creativity. For that reason, |
|---|
| 14 | | Django entirely automates creation of admin interfaces for models. |
|---|
| 15 | | |
|---|
| 16 | | Django was written in a newsroom environment, with a very clear separation |
|---|
| 17 | | between "content publishers" and the "public" site. Site managers use the |
|---|
| 18 | | system to add news stories, events, sports scores, etc., and that content is |
|---|
| 19 | | displayed on the public site. Django solves the problem of creating a unified |
|---|
| 20 | | interface for site administrators to edit content. |
|---|
| 21 | | |
|---|
| 22 | | The admin isn't necessarily intended to be used by site visitors; it's for site |
|---|
| 23 | | managers. |
|---|
| 24 | | |
|---|
| 25 | | Activate the admin site |
|---|
| 26 | | ======================= |
|---|
| 27 | | |
|---|
| 28 | | The Django admin site is not activated by default -- it's an opt-in thing. To |
|---|
| 29 | | activate the admin site for your installation, do these three things: |
|---|
| 30 | | |
|---|
| 31 | | * Add ``"django.contrib.admin"`` to your ``INSTALLED_APPS`` setting. |
|---|
| 32 | | * Run ``python manage.py syncdb``. Since you have added a new application |
|---|
| 33 | | to ``INSTALLED_APPS``, the database tables need to be updated. |
|---|
| 34 | | * Edit your ``mysite/urls.py`` file and uncomment the line below |
|---|
| 35 | | "Uncomment this for admin:". This file is a URLconf; we'll dig into |
|---|
| 36 | | URLconfs in the next tutorial. For now, all you need to know is that it |
|---|
| 37 | | maps URL roots to applications. |
|---|
| 38 | | |
|---|
| 39 | | Start the development server |
|---|
| 40 | | ============================ |
|---|
| 41 | | |
|---|
| 42 | | Let's start the development server and explore the admin site. |
|---|
| 43 | | |
|---|
| 44 | | Recall from Tutorial 1 that you start the development server like so:: |
|---|
| | 1 | =========================================== |
|---|
| | 2 | Twoja pierwsza aplikacja w Django, część 2 |
|---|
| | 3 | =========================================== |
|---|
| | 4 | Tłumaczenie: Marcin Sztolcman <marcin {} urzenia // net> |
|---|
| | 5 | Poprawki: Maciej Litwiniuk <maciej // litwiniuk {} galdomedia // pl> |
|---|
| | 6 | |
|---|
| | 7 | Ta część tutoriala zaczyna się w miejscu, w którym skończyła się `część pierwsza`_. |
|---|
| | 8 | Będziemy kontynuować budowę aplikacji webowej - sondy - i skupimy się na |
|---|
| | 9 | automatycznie generowanym panelu administracyjnym. |
|---|
| | 10 | |
|---|
| | 11 | |
|---|
| | 12 | .. _część pierwsza: ../tutorial01/ |
|---|
| | 13 | |
|---|
| | 14 | .. admonition:: Założenia |
|---|
| | 15 | |
|---|
| | 16 | Generowanie panelu administracyjnego dla klientów aby mogli dodawać, edytować i |
|---|
| | 17 | 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 | administracyjnego. |
|---|
| | 20 | |
|---|
| | 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 |
|---|
| | 25 | tworzeniem uniwersalnych paneli administracyjnych na potrzeby edycji treści. |
|---|
| | 26 | |
|---|
| | 27 | Panel administracyjny nie jest przeznaczony do użytku przez osoby odwiedzające |
|---|
| | 28 | naszą stronę - jest dla osób zarządzających tą stroną. |
|---|
| | 29 | |
|---|
| | 30 | Aktywacja panelu administracyjnego |
|---|
| | 31 | ================================== |
|---|
| | 32 | |
|---|
| | 33 | Część administracyjna Django jest domyślnie wyłączona - można ją opcjonalnie włączyć. |
|---|
| | 34 | Aby aktywować intrfejs administracyjny dla swojej instalacji, trzeba wykonać trzy |
|---|
| | 35 | kroki: |
|---|
| | 36 | |
|---|
| | 37 | * Dodać ``"django.contrib.admin"`` do ustawień ``INSTALLED_APPS``. |
|---|
| | 38 | * Wykonać komendę ``python manage.py syncdb``. Jako, że dodałeś nową aplikację do |
|---|
| | 39 | ``INSTALLED_APPS``, tabele w bazie danych muszą zostać uaktualnione. |
|---|
| | 40 | * 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. |
|---|
| | 43 | Na tą chwilę wystarczy Ci wiedzieć, że rzutuje on adresy URL na Twoją aplikację. |
|---|
| | 44 | |
|---|
| | 45 | Uruchomienie serwera deweloperskiego |
|---|
| | 46 | ==================================== |
|---|
| | 47 | |
|---|
| | 48 | Uruchommy serwer deweloperski i przyjrzyjmy się stronie administracyjnej. |
|---|
| | 49 | |
|---|
| | 50 | Przypomnij sobie z części pierszej, że serwer deweloperski uruchamiałeś poleceniem: |
|---|
| 64 | | You should see a few other types of editable content, including groups, users |
|---|
| 65 | | and sites. These are core features Django ships with by default. |
|---|
| 66 | | |
|---|
| 67 | | .. _"I can't log in" questions: ../faq/#the-admin-site |
|---|
| 68 | | |
|---|
| 69 | | Make the poll app modifiable in the admin |
|---|
| 70 | | ========================================= |
|---|
| 71 | | |
|---|
| 72 | | But where's our poll app? It's not displayed on the admin index page. |
|---|
| 73 | | |
|---|
| 74 | | Just one thing to do: We need to specify in the ``Poll`` model that ``Poll`` |
|---|
| 75 | | objects have an admin interface. Edit the ``mysite/polls/models.py`` file and |
|---|
| 76 | | make the following change to add an inner ``Admin`` class:: |
|---|
| | 71 | Powinienneś zobaczyć również kilk innycg typów edytowalnych treści, w tym grupy, |
|---|
| | 72 | użytkowników oraz strony. To jest podstawowa funkcjonalność, którą Django |
|---|
| | 73 | dostarczana domyślnie. |
|---|
| | 74 | |
|---|
| | 75 | .. _"Nie mogę się zalogować": ../faq/#the-admin-site |
|---|
| | 76 | |
|---|
| | 77 | Modyfikacja sondy z panelu admina |
|---|
| | 78 | ================================= |
|---|
| | 79 | |
|---|
| | 80 | Ale gdzie jest nasza sonda? Nie ma jej przecież w panelu administracyjnym. |
|---|
| | 81 | |
|---|
| | 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 | | The ``class Admin`` will contain all the settings that control how this model |
|---|
| 84 | | appears in the Django admin. All the settings are optional, however, so |
|---|
| 85 | | creating an empty class means "give this object an admin interface using |
|---|
| 86 | | all the default options." |
|---|
| 87 | | |
|---|
| 88 | | Now reload the Django admin page to see your changes. Note that you don't have |
|---|
| 89 | | to restart the development server -- the server will auto-reload your project, |
|---|
| 90 | | so any modifications code will be seen immediately in your browser. |
|---|
| 91 | | |
|---|
| 92 | | Explore the free admin functionality |
|---|
| 93 | | ==================================== |
|---|
| 94 | | |
|---|
| 95 | | Now that ``Poll`` has the inner ``Admin`` class, Django knows that it should be |
|---|
| 96 | | displayed on the admin index page: |
|---|
| | 91 | Sekcja ``class Admin`` będzie zawierać wszystkie ustawienia związane ze sposobem |
|---|
| | 92 | w jaki ten model będzie prezetowany w panelu admina. Wszystkie ustawienia są |
|---|
| | 93 | opcjonalne, jednak dodanie pustej klasy oznacza "dodaj ten obiekt do panelu |
|---|
| | 94 | administracyjnego z użyciem domyślnych opcji" |
|---|
| | 95 | |
|---|
| | 96 | Teraz odśwież stronę panelu, by zobaczyć zmiany. Zauważ, że nie musiałeś |
|---|
| | 97 | ponownie uruchamiaś serwera deweloperskiego -- serwer automatycznie przeładuje |
|---|
| | 98 | projekt, więc wszelkie zmiany będą od razu widoczne w twej przeglądarce. |
|---|
| | 99 | |
|---|
| | 100 | Badanie funkcjonalności admina |
|---|
| | 101 | ============================== |
|---|
| | 102 | |
|---|
| | 103 | Teraz, gdy model ``Poll`` posiada wewnętrzną klasę ``Admin``, Django wie, że ma |
|---|
| | 104 | wyświetlić go w panelu: |
|---|
| 116 | | Things to note here: |
|---|
| 117 | | |
|---|
| 118 | | * The form is automatically generated from the Poll model. |
|---|
| 119 | | * The different model field types (``models.DateTimeField``, ``models.CharField``) |
|---|
| 120 | | correspond to the appropriate HTML input widget. Each type of field knows |
|---|
| 121 | | how to display itself in the Django admin. |
|---|
| 122 | | * Each ``DateTimeField`` gets free JavaScript shortcuts. Dates get a "Today" |
|---|
| 123 | | shortcut and calendar popup, and times get a "Now" shortcut and a convenient |
|---|
| 124 | | popup that lists commonly entered times. |
|---|
| 125 | | |
|---|
| 126 | | The bottom part of the page gives you a couple of options: |
|---|
| 127 | | |
|---|
| 128 | | * Save -- Saves changes and returns to the change-list page for this type of |
|---|
| 129 | | object. |
|---|
| 130 | | * Save and continue editing -- Saves changes and reloads the admin page for |
|---|
| 131 | | this object. |
|---|
| 132 | | * Save and add another -- Saves changes and loads a new, blank form for this |
|---|
| 133 | | type of object. |
|---|
| 134 | | * Delete -- Displays a delete confirmation page. |
|---|
| 135 | | |
|---|
| 136 | | Change the "Date published" by clicking the "Today" and "Now" shortcuts. Then |
|---|
| 137 | | click "Save and continue editing." Then click "History" in the upper right. |
|---|
| 138 | | You'll see a page listing all changes made to this object via the Django admin, |
|---|
| 139 | | with the timestamp and username of the person who made the change: |
|---|
| | 125 | Rzeczy które warto zauważyć: |
|---|
| | 126 | |
|---|
| | 127 | * Formularz został wygenerowany automatycznie na podstawie informacji z modelu |
|---|
| | 128 | 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ć wywietlony w panelu |
|---|
| | 131 | 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 |
|---|
| | 135 | "Now" ("Teraz") oraz drugi, służący do pokazania okienka z listą najczęściej |
|---|
| | 136 | używanych określeń czasu. |
|---|
| | 137 | |
|---|
| | 138 | Dolna część strony daje kilka opcji: |
|---|
| | 139 | |
|---|
| | 140 | * 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 | przeładowuje stronę dla tego obiektu |
|---|
| | 143 | * Save and add another (Zapisz i dodaj nowe) -- zapisuje zmiany i przenosi do |
|---|
| | 144 | nowego, pustego formularza odpowiedniego dla danego rodzaju obiektu. |
|---|
| | 145 | * Delete (Usuń) -- wyświetla ekran potwierdzający usunięcie obiektu. |
|---|
| | 146 | |
|---|
| | 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 |
|---|
| | 149 | editing" ("Zapisz i kontynuuj edycję"). Teraz wybierz "History" ("Historia") |
|---|
| | 150 | 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 | osoby dokonującej tą zmianę: |
|---|
| 194 | | :alt: Fieldset is initially collapsed |
|---|
| 195 | | |
|---|
| 196 | | Adding related objects |
|---|
| 197 | | ====================== |
|---|
| 198 | | |
|---|
| 199 | | OK, we have our Poll admin page. But a ``Poll`` has multiple ``Choices``, and |
|---|
| 200 | | the admin page doesn't display choices. |
|---|
| 201 | | |
|---|
| 202 | | Yet. |
|---|
| 203 | | |
|---|
| 204 | | There are two ways to solve this problem. The first is to give the ``Choice`` |
|---|
| 205 | | model its own inner ``Admin`` class, just as we did with ``Poll``. Here's what |
|---|
| 206 | | that would look like:: |
|---|
| | 208 | :alt: Zestaw pól jest teraz wstępnie zwinięty |
|---|
| | 209 | |
|---|
| | 210 | Dodawanie obiektów powiązanych |
|---|
| | 211 | ============================== |
|---|
| | 212 | |
|---|
| | 213 | Ok. Mamy już w panelu nasze sondy. Ale każda sonda (``Poll``) ma kilka |
|---|
| | 214 | odpowiedzi (``Choices``), a w panelu nie są one wyświetlane. |
|---|
| | 215 | |
|---|
| | 216 | Jeszcze. |
|---|
| | 217 | |
|---|
| | 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 |
|---|
| | 220 | ``Polls``. Tak by to wyglądało:: |
|---|
| 217 | | :alt: Choice admin page |
|---|
| 218 | | |
|---|
| 219 | | In that form, the "Poll" field is a select box containing every poll in the |
|---|
| 220 | | database. Django knows that a ``ForeignKey`` should be represented in the admin |
|---|
| 221 | | as a ``<select>`` box. In our case, only one poll exists at this point. |
|---|
| 222 | | |
|---|
| 223 | | Also note the "Add Another" link next to "Poll." Every object with a ForeignKey |
|---|
| 224 | | relationship to another gets this for free. When you click "Add Another," you'll |
|---|
| 225 | | get a popup window with the "Add poll" form. If you add a poll in that window |
|---|
| 226 | | and click "Save," Django will save the poll to the database and dynamically add |
|---|
| 227 | | it as the selected choice on the "Add choice" form you're looking at. |
|---|
| 228 | | |
|---|
| 229 | | But, really, this is an inefficient way of adding Choice objects to the system. |
|---|
| 230 | | It'd be better if you could add a bunch of Choices directly when you create the |
|---|
| 231 | | Poll object. Let's make that happen. |
|---|
| 232 | | |
|---|
| 233 | | Remove the ``Admin`` for the Choice model. Then, edit the ``ForeignKey(Poll)`` |
|---|
| 234 | | field like so:: |
|---|
| | 231 | :alt: Strona administracyjna dla odpowiedzi |
|---|
| | 232 | |
|---|
| | 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 |
|---|
| | 236 | jedna sonda chwilowo została zapisana. |
|---|
| | 237 | |
|---|
| | 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 |
|---|
| | 242 | pomocą tego okienka i klikniesz "Save", Django zapisze nową sondę w bazie danych |
|---|
| | 243 | oraz uaktualni pole wyboru znajdujące się w formularzu odpowiedzi ("Choice"). |
|---|
| | 244 | |
|---|
| | 245 | Powyższy sposób nie jest najbardziej efektywną metodą dodawania obiektów |
|---|
| | 246 | odpowiedzi do systemu. Byłoby wygodniej, jeśli mógłbyś dodawać odpowiedzi |
|---|
| | 247 | do sondy bezpośrednio z formularza w którym tworzysz nową sondę. Skoro tak, |
|---|
| | 248 | to spróbujmy to wykonać. |
|---|
| | 249 | |
|---|
| | 250 | Usuń klasę ``Admin`` z modelu Choice. Następnie zmień pole klucza obcego w |
|---|
| | 251 | obiekcie Choice:: |
|---|
| 257 | | It works like this: There are three slots for related Choices -- as specified |
|---|
| 258 | | by ``num_in_admin`` -- but each time you come back to the "Change" page for an |
|---|
| 259 | | already-created object, you get one extra slot. (This means there's no |
|---|
| 260 | | hard-coded limit on how many related objects can be added.) If you wanted space |
|---|
| 261 | | for three extra Choices each time you changed the poll, you'd use |
|---|
| 262 | | ``num_extra_on_change=3``. |
|---|
| 263 | | |
|---|
| 264 | | One small problem, though. It takes a lot of screen space to display all the |
|---|
| 265 | | fields for entering related Choice objects. For that reason, Django offers an |
|---|
| 266 | | alternate way of displaying inline related objects:: |
|---|
| | 274 | Działa to w następujący sposób: są tam 3 pola odpowiedzi -- jak zostało ustalone |
|---|
| | 275 | przez opcję ``num_in_admin`` -- ale za każdym razem gdy wrócisz do strony już |
|---|
| | 276 | stworzonego obiektu, dostaniesz kolejne pole odpowiedzi (tzn. nie ma na sztywno |
|---|
| | 277 | ustawionego ograniczenia co do ilości powiązanych obiektów które można dodać). |
|---|
| | 278 | Jeśli chcesz otrzymywać za każdym razem trzy nowe pola na odpowiedzi, musisz |
|---|
| | 279 | użyć parametru ``num_extra_on_change=3``. |
|---|
| | 280 | |
|---|
| | 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 |
|---|
| | 283 | sposób wyświetlenia wewnętrznie powiązanych obiektów:: |
|---|
| 343 | | That adds a search box at the top of the change list. When somebody enters |
|---|
| 344 | | search terms, Django will search the ``question`` field. You can use as many |
|---|
| 345 | | fields as you'd like -- although because it uses a ``LIKE`` query behind the |
|---|
| 346 | | scenes, keep it reasonable, to keep your database happy. |
|---|
| 347 | | |
|---|
| 348 | | Finally, because Poll objects have dates, it'd be convenient to be able to |
|---|
| 349 | | drill down by date. Add this line:: |
|---|
| | 361 | Na górze strony pojawiło się teraz pole wyszukiwarki. Gdy zostanie tam wpisana |
|---|
| | 362 | jakaś fraza, Django przeszuka pola ``question``. Możesz użyć tylu pól ile |
|---|
| | 363 | potrzebujesz -- aczkolwiek pamiętaj, że Django używa tutaj kwerendy ``SQL LIKE``, |
|---|
| | 364 | więc umieszczaj tu tylko te pola których potrzebujesz. |
|---|
| | 365 | |
|---|
| | 366 | Na koniec, ponieważ nasza sonda posiada daty, powinniśmy pogrupować nasze sondy |
|---|
| | 367 | po tym właśnie polu. Dodaj poniższą linijkę:: |
|---|
| 353 | | That adds hierarchical navigation, by date, to the top of the change list page. |
|---|
| 354 | | At top level, it displays all available years. Then it drills down to months |
|---|
| 355 | | and, ultimately, days. |
|---|
| 356 | | |
|---|
| 357 | | Now's also a good time to note that change lists give you free pagination. The |
|---|
| 358 | | default is to display 50 items per page. Change-list pagination, search boxes, |
|---|
| 359 | | filters, date-hierarchies and column-header-ordering all work together like you |
|---|
| 360 | | think they should. |
|---|
| 361 | | |
|---|
| 362 | | Customize the admin look and feel |
|---|
| | 371 | Teraz na górze strony pojawiły się pola ułatwiające nawigację po dacie. Na |
|---|
| | 372 | samej górze pokazane są dostępne lata. Później miesiące i dni. |
|---|
| | 373 | |
|---|
| | 374 | Pozostało mi jeszcze poinformować Ciebie, że lista sond jest automatycznie |
|---|
| | 375 | dzielona na strony mieszczące domyślnie do 50 obiektów. Stronicowanie listy |
|---|
| | 376 | sond, pole wyszukiwarki, filtry, grupowanie po datach i sortowanie po kolumnach |
|---|
| | 377 | wspópracują ze sobą tak jak tego oczekujesz. |
|---|
| | 378 | |
|---|
| | 379 | Upiększanie panelu administracyjnego |
|---|
| 365 | | Clearly, having "Django administration" at the top of each admin page is |
|---|
| 366 | | ridiculous. It's just placeholder text. |
|---|
| 367 | | |
|---|
| 368 | | That's easy to change, though, using Django's template system. The Django admin |
|---|
| 369 | | is powered by Django itself, and its interfaces use Django's own template |
|---|
| 370 | | system. (How meta!) |
|---|
| 371 | | |
|---|
| 372 | | Open your settings file (``mysite/settings.py``, remember) and look at the |
|---|
| 373 | | ``TEMPLATE_DIRS`` setting. ``TEMPLATE_DIRS`` is a tuple of filesystem |
|---|
| 374 | | directories to check when loading Django templates. It's a search path. |
|---|
| 375 | | |
|---|
| 376 | | By default, ``TEMPLATE_DIRS`` is empty. So, let's add a line to it, to tell |
|---|
| 377 | | Django where our templates live:: |
|---|
| | 382 | Tak naprawdę, napis "Django administration" na górze każdej strony jest nieco |
|---|
| | 383 | mylący. Jest tylko "wypełniaczem". |
|---|
| | 384 | |
|---|
| | 385 | Bardzo łatwo jest je zmienić korzystając z systemu szablonów Django. Panel |
|---|
| | 386 | administracyjny Django jest tworzony przez samo Django, więc nic dziwnego, |
|---|
| | 387 | że korzysta ze swojego własnego systemu szablonów. |
|---|
| | 388 | |
|---|
| | 389 | Otwórz swój plik ustawień (``mysite/settings.py``, pamiętaj) i spójrz na opcję |
|---|
| | 390 | ``TEMPLATE_DIRS``. Jest to krotka, przechowywująca ścieżki do katalogów które |
|---|
| | 391 | Django ma sprawdzać w poszukiwaniu szablonów. |
|---|
| | 392 | |
|---|
| | 393 | Domyślnie ``TEMPLATE_DIRS`` jest puste. Dodajmy tam linię aby poinformować |
|---|
| | 394 | Django gdzie ma szukać szablonów:: |
|---|
| 383 | | Now copy the template ``admin/base_site.html`` from within the default Django |
|---|
| 384 | | admin template directory (``django/contrib/admin/templates``) into an ``admin`` |
|---|
| 385 | | subdirectory of whichever directory you're using in ``TEMPLATE_DIRS``. For |
|---|
| 386 | | example, if your ``TEMPLATE_DIRS`` includes ``"/home/my_username/mytemplates"``, |
|---|
| 387 | | as above, then copy ``django/contrib/admin/templates/admin/base_site.html`` to |
|---|
| 388 | | ``/home/my_username/mytemplates/admin/base_site.html``. Don't forget that |
|---|
| 389 | | ``admin`` subdirectory. |
|---|
| 390 | | |
|---|
| 391 | | Then, just edit the file and replace the generic Django text with your own |
|---|
| 392 | | site's name as you see fit. |
|---|
| 393 | | |
|---|
| 394 | | Note that any of Django's default admin templates can be overridden. To |
|---|
| 395 | | override a template, just do the same thing you did with ``base_site.html`` -- |
|---|
| 396 | | copy it from the default directory into your custom directory, and make |
|---|
| 397 | | changes. |
|---|
| 398 | | |
|---|
| 399 | | Astute readers will ask: But if ``TEMPLATE_DIRS`` was empty by default, how was |
|---|
| 400 | | Django finding the default admin templates? The answer is that, by default, |
|---|
| 401 | | Django automatically looks for a ``templates/`` subdirectory within each app |
|---|
| 402 | | package, for use as a fallback. See the `loader types documentation`_ for full |
|---|
| 403 | | information. |
|---|
| | 400 | Skopiuj teraz plik ``admin/base_site.html`` z domyślnego katalogu szablonów |
|---|
| | 401 | Django (``django/contrib/admin/templates``) do podkatalogu admin w którymkolwiek |
|---|
| | 402 | 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 |
|---|
| | 405 | katalogu ``/home/my_username/mytemplates/admin/base_site.html``. Nie zapomnij |
|---|
| | 406 | o tym podkatalogu ``admin``. |
|---|
| | 407 | |
|---|
| | 408 | Teraz wystarczy wyedytować skopiowany plik zastępując domyślne teksty Django |
|---|
| | 409 | swoimi. |
|---|
| | 410 | |
|---|
| | 411 | 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 | skopiuj go z domyślnego katalogu do swojego, i wykonaj zmiany. |
|---|
| | 414 | |
|---|
| | 415 | Uważni czytelnicy mogą zapytać: skoro ``TEMPLATE_DIRS`` był domyślnie pusty, |
|---|
| | 416 | jak Django wyszukiwał domyślne szablony do panelu administracyjnego ? |
|---|
| | 417 | Odpowiedź: domyślnie, Django automatycznie szuka w podkatalogu ``templates/`` |
|---|
| | 418 | każdej aplikacji. Zajrzyj do `loader types documentation`_, żeby dowiedzieś |
|---|
| | 419 | się więcej. |
|---|
| 410 | | On a similar note, you might want to customize the look and feel of the Django |
|---|
| 411 | | admin index page. |
|---|
| 412 | | |
|---|
| 413 | | By default, it displays all available apps, according to your ``INSTALLED_APPS`` |
|---|
| 414 | | setting. But the order in which it displays things is random, and you may want |
|---|
| 415 | | to make significant changes to the layout. After all, the index is probably the |
|---|
| 416 | | most important page of the admin, and it should be easy to use. |
|---|
| 417 | | |
|---|
| 418 | | The template to customize is ``admin/index.html``. (Do the same as with |
|---|
| 419 | | ``admin/base_site.html`` in the previous section -- copy it from the default |
|---|
| 420 | | directory to your custom template directory.) Edit the file, and you'll see it |
|---|
| 421 | | uses a template tag called ``{% get_admin_app_list as app_list %}``. That's the |
|---|
| 422 | | magic that retrieves every installed Django app. Instead of using that, you can |
|---|
| 423 | | hard-code links to object-specific admin pages in whatever way you think is |
|---|
| 424 | | best. |
|---|
| 425 | | |
|---|
| 426 | | Django offers another shortcut in this department. Run the command |
|---|
| 427 | | ``python manage.py adminindex polls`` to get a chunk of template code for |
|---|
| 428 | | inclusion in the admin index template. It's a useful starting point. |
|---|
| 429 | | |
|---|
| 430 | | For full details on customizing the look and feel of the Django admin site in |
|---|
| 431 | | general, see the `Django admin CSS guide`_. |
|---|
| 432 | | |
|---|
| 433 | | When you're comfortable with the admin site, read `part 3 of this tutorial`_ to |
|---|
| 434 | | start working on public poll views. |
|---|
| | 426 | Kontynuując temat zmian wyglądu, możesz także dostosować dla siebie stronę z |
|---|
| | 427 | listą dostępnych aplikacji (indeks) panelu administracyjnego. |
|---|
| | 428 | |
|---|
| | 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ć |
|---|
| | 433 | prosty w użyciu. |
|---|
| | 434 | |
|---|
| | 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 katalogu |
|---|
| | 437 | domyślnego do swojego). Następnie wyedytuj ten plik -` zobaczysz że jest w nim |
|---|
| | 438 | 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 |
|---|
| | 441 | odpowiedzialnych za konkretne obiekty - i ułożyć je tak jak uważasz, że będzie |
|---|
| | 442 | najlepiej. |
|---|
| | 443 | |
|---|
| | 444 | 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 | który należy umieścić w szablonie indeksu. Jest to na początku bardzo przydatne. |
|---|
| | 447 | |
|---|
| | 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 |
|---|
| | 452 | `trzecią część tego tutoriala`_ aby zacząć tworzyć publicznie widoczną stronę |
|---|
| | 453 | aplikacji. |
|---|