Django: Administrace

Automaticky generovanou administraci lze označit za killer feature Djanga. Umožňuje uživatelům jednoduše přidávat, upravovat a mazat data v projektu, aniž bychom museli programovat vlastní správcovská rozhraní. V dnešním článku si ukážeme, jak takové administrační rozhraní v Djangu vytvořit.

Seriál: Hrajeme si s Djangem (16 dílů)

  1. Django: Úvod a instalace 14.8.2009
  2. Django: Nastavení projektu a první pokusy 21.8.2009
  3. Django: Databázový model 28.8.2009
  4. Django: Databázový model podruhé 4.9.2009
  5. Django: Administrace 11.9.2009
  6. Django: Prezentace dat 18.9.2009
  7. Django: Prezentace dat podruhé 25.9.2009
  8. Django: Zpracovávání formulářů 2.10.2009
  9. Django: Autentizace a autorizace 9.10.2009
  10. Django: Nahrávání souborů 16.10.2009
  11. Django: Zabudované aplikace 23.10.2009
  12. Django: Rozšiřování možností Djanga 30.10.2009
  13. Django: Internacionalizace 6.11.2009
  14. Django: Nasazování projektu 13.11.2009
  15. Django: Kešování a škálování 20.11.2009
  16. Django: Závěr 27.11.2009

V předchozích dvou dílech jsme si definovali několik datových modelů. Budeme chtít, aby fiktivní zaměstnanci videopůjčovny mohli záznamy v těchto modelech spravovat bez naší asistence. Začneme aktivováním administrátorské aplikace v projektu a správným nastavením URL.

Zprovoznění administrace

Opět si nejprve otevřeme soubor settings.py z adresáře projektu a upravíme pár konstant. Mezi položky v INSTALLED_APPS  přidáme 'django.contrib.admin', konstanta by pak měla vypadat například takto:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'hrajeme_si.video_store',
)

Dále máme možnost změnit konstantu LANGUAGE_CODE, která určuje jazyk projektu. Díky tomu bude administrace v takovém jazyce, jaký si zvolíme. Pro češtinu je nastavení kód LANGUAGE_CODE = 'cs', pro slovenštinu LANGUAGE_CODE = 'sk'. Ať už si vybereme jazyk jakýkoliv, neměli bychom zapomenout synchronizovat databázi:

$ python manage.py syncdb
Creating table django_admin_log
Installing index for admin.LogEntry model 

Po nastavení nám zbývá ještě provázat administraci s URL. Proto je potřeba na konec souboru url.py připsat tento kód:

from django.contrib import admin

admin.autodiscover()

urlpatterns += patterns('',
    ('^admin/', include(admin.site.urls)), # Django 1.0: ('^admin/(.*)', admin.site.root),
)

Zavoláním metody autodiscover se do administrace načtou modely z INSTALLED_APPS, čímž je připravena k použití. V komentáři je ukázáno, jak administraci zprovoznit ve starší verzi Djanga. Standardní cestou je /admin/, takže stačí nastartovat vývojový server ( python manage.py runserver) a na adrese http://127.0.0.1:8000/admin/ uvidíme přihlašovací dialog.

Django

Na této stránce se přihlásíme pomocí administrátorského jména a hesla, které jsme si vytvořili ve třetím dílu seriálu. Pokud jste se vytváření vyhnuli nebo přihlašovací údaje mezitím zapomněli, máte možnost si pomocí příkazu python manage.py createsuperuser vytvořit nové.

Ovládání

Po přihlášení uvidíme administrátorské rozhraní se třemi základními modely: skupiny (groups), uživatelé (users) a weby (sites).

Django

Aplikace weby nám umožňuje projekt provozovat na více doménách najednou a na každé doméně udržovat jiný obsah. Prozatím se tím nebudeme zabývat. Aplikace uživatelé obsahuje ve výchozím nastavení pouze našeho administrátora, můžeme však přidat i běžné uživatele. Těm se později dají jednoduše přidělovat oprávnění pomocí uživatelských skupin. Hesla uživatelů se standardně ukládají jako osolený SHA-1 hash, což je považováno za poměrně bezpečné.

Záznamy lze prohlížet, dá se v nich vyhledávat, filtrovat je, libovolně je upravovat a mazat.

Django

Veškeré úpravy se zaznamenávají a jsou vypisovány v přehledu na titulní straně.

Zavedení modelů do administrace

Aby se náš model zobrazil v administraci a my s ním mohli manipulovat, je potřeba ho do administrace registrovat. K tomu slouží soubor admin.py, jejž si vytvoříme v adresáři s aplikací ( video_store).

Django v pojmenování souborů zastává princip konvence místo konfigurace, což znamená, že nemáme možnost určovat názvy hlavních souborů v aplikaci. Má to výhodu, že se v cizích projektech rychleji zorientujeme, protože budeme zhruba vědět, co který soubor obsahuje.

Nejjednodušší zavedení modelu vypadá takto:

from django.contrib import admin
from models import Store, Film, Director

admin.site.register(Store)

To vytvoří v administraci další položku, která je už plně funkční — po kliknutí na odkaz Provozovny můžeme vidět naše dvě přidané pobočky. Všimněte si, že se používají vyplněné údaje z meta vlastností modelu verbose_name a verbose_name_plural ze souboru  video_store/models.py.

Django

Takový přehled je ale příliš strohý. Chtěli bychom vidět rovnou i jednotlivé adresy, bez toho, abychom museli otevírat náhled konkrétní pobočky. Nahradíme tedy poslední řádek v souboru video_store/admin.py za následující kód:

class StoreAdmin(admin.ModelAdmin):
    list_display = ('store', 'address', 'city', 'postal_code')

admin.site.register(Store, StoreAdmin)

V tomto kódu jsme zdědili třídu ModelAdmin, která reprezentuje náš model v administraci. Atribut list_display ovlivňuje zobrazení sloupců ve výpisu a my ho přepsali za vlastní. Posledním řádkem jsme opět registrovali model s pomocí vlastní verze třídy  ModelAdmin.

Django

Teď se podíváme na další dva modely, Film a Director. Registrujeme je podobně jako v předchozím případě a přidáme několik funkcí navíc:

class FilmAdmin(admin.ModelAdmin):
    list_display = ('name_czech', 'name_original', 'year', 'director', 'format')
    list_filter = ('format', 'store')
    search_fields = ['name_czech', 'name_original']

admin.site.register(Film, FilmAdmin)

class DirectorAdmin(admin.ModelAdmin):
    search_fields = ['name']

admin.site.register(Director, DirectorAdmin)

Máme tu dva nové atributy: list_filter a search_fields. Pomocí atributu list_filter zobrazíme na pravém boku filtrování, můžeme teď filtrovat filmy dle formátu filmu a pobočky, ve které jsou dostupné. Druhý atribut, search_fields, nám vytvoří jednoduché vyhledávání podle daných kritérií. Vyhledávání je zapnuté i u modelu s režiséry. Pozor, search_fields se zadává jako seznam (hranaté závorky) místo n-tice (kulaté závorky).

Django

Django admin director

Můžeme teď zkusit přidat nějaké filmy. Stačí kliknout na odkaz přidat a vyplnit údaje. Všimněte si, že již máme předvyplněnou cenu (parametr default) a že se vztahy zobrazují jako výběry z jedné (one-to-many) nebo více (many-to-many) položek. Pokud by se nám to nelíbilo, můžeme to změnit na klasické textové políčko pomocí atributu raw_id_fields. Kliknutím na malé plus můžeme přidat další záznam do odpovídajícího modelu.

Django

Pomocí atributů fields nebo exclude máme možnost specifikovat, které části modelu chceme použít. Kompletní popis včetně příkladů naleznete v oficiální dokumentaci.

Přepisování šablon administrace

Na závěr si ukážeme, jak zasahovat do šablon, aniž bychom přepisovali instalaci Djanga. Vlevo nahoře je v české verzi nápis Správa systému Django, který přepíšeme na něco vhodnějšího. Nejprve je potřeba zjistit, kam se Django nainstalovalo (v mém případě to byl adresář /usr/lib/python2.5/site-packages/django/) a poté přejít do podadresáře contrib/admin/templates/admin. Ten obsahuje šablony administrace.

V našem projektu si vytvoříme v adresáři templates podadresář admin (opět se jedná o konvenci), do kterého zkopírujeme soubor base_site.html. Ten by měl obsahovat následující řádek:

<h1 id="site-name">{% trans 'Django administration' %}</h1> 

Tento řádek přepíšeme na:

<h1 id="site-name">Videopůjčovny s. r. o.</h1> 

… a máme upravený nadpis administrace.

Django

Stejně tak můžeme jednoduše modifikovat veškeré ostatní části administrace podle potřeby. Dá se dokonce pro každý náš model nebo aplikaci vytvořit specifickou šablonu. Stačí vzít příslušnou šablonu z: app_index.html, change_form.html, change_list.html, delete_confirmation.html, object_history.html, nahrát ji do adresáře templates/admin/aplikace/, tedy v našem případě templates/admin/video_store/ a upravit ji.

Související odkazy

Příště se budeme zabývat podrobněji pohledy a šablonovacím systémem.

Autor je dlouhodobým studentem Fakulty informatiky, webový nadšenec a programátor — nejraději programuje v jazycích Haskell a Python.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 6

Přehled komentářů

skrat pyjamas
Pavel Dvořák Re: pyjamas
skrat Re: pyjamas
Pavel Dvořák Re: pyjamas
hynek Kvůli vytvoření admin.py restartovat server
Spiler Maly problem
Zdroj: https://www.zdrojak.cz/?p=3083