Django posiada rozbudowany i generowany "automatycznie" Panel Admina dla naszych aplikacji. By go uruchomić upewnij się czy masz
'django.contrib.admin', dodane do
INSTALLED_APPS (jeżeli nie to dodaj i wykonaj polecenie "syncdb"). Następnie edytuj plik
urls.py do postaci typu:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/(.*)', admin.site.root),
)
Pod adresem
http://localhost:8000/admin/ dostępny będzie Panel Admina, do którego logujemy się danymi podanymi przy tworzeniu bazy danych / superużytkownika. Po zalogowaniu zobaczymy coś takiego:
Możemy zarządzać kontami użytkowników, czy też tworzyć grupy posiadające różne uprawnienia. "Strony" to aplikacja, która przydaje się gdy chcemy uruchomić więcej niż jeden serwis bazujący na tym samym kodzie i bazie danych. Stworzone przez nas aplikacje będą posiadały w Panelu Admina interfejs pozwalający na zarządzanie rekordami (dodaj, edytuj, usuń itp.).
Dla Django 1.0 konfiguracja Panelu Admina dla modeli odbywa się poprzez plik
admin.py umieszczony w katalogu aplikacji (np news/admin.py). Oto najprostszy przypadek udostępniania modeli w PA:
# -*- coding: utf-8 -*-
from django.contrib import admin
#import pliku z modelami
from news.models import *
#rejestrujemy każdy model podając jego nazwę
admin.site.register(Category)
admin.site.register(News)
Po restarcie serwera deweloperskiego w Panelu Admina powinniśmy zobaczyć nasze modele:
Możemy teraz dowolnie zarządzać danymi w tych modelach.
Panel Admina posiada bardzo szerokie możliwości dopasowywania. Za pomocą klasy
NAZWA_MODELUAdmin możemy wpływać na wygląd formularzy dodawania/edycji, dane wyświetlane na liście istniejących wpisów i znacznie więcej. Oto przykład:
# -*- coding: utf-8 -*-
from django.contrib import admin
from news.models import *
# dla kategorii
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name','icon')
prepopulated_fields = {'slug': ('name',)}
# dla wiadomości
class NewsAdmin(admin.ModelAdmin):
list_display = ('title','date')
prepopulated_fields = {'slug': ('title',)}
# rejestracja wraz z podaniem klasy konfigurującej PA
admin.site.register(Category, CategoryAdmin)
admin.site.register(News, NewsAdmin)
Zastosowaliśmy tutaj
list_display - listę pól, jakie mają byś wyświetlane na liście wpisów, oraz
prepopulated_fields - słownik określający pola, z których mają być generowane wartości dla pól odnośnikowych "Slug". Dodając nazwę kategorii ("name") automatycznie wstawiony zostanie przefiltrowany tekst do pola odnośnika "slug". Podobnie dla wiadomości.
By określić pola, których wartości mają być wyświetlane należy zdefiniować zmienną
list_display
list_display = ('nazwa pola', 'nazwa pola')
Dodanie zmiennej
list_filter doda po prawej stronie listy wpisów menu umożliwiające filtrowanie ich po wartościach danego pola. Zmienna
search_fields zawierająca nazwy pól doda opcję wyszukiwania pośród tych pól:
search_fields = ['news_title', 'news_text']
date_hierarchy zawierające nazwę pola typu DateTimeField lub DateField doda nad listą wpisów menu archiwalne umożliwiające wyświetlanie wpisów dla danych lat, miesięcy itd.
Możemy ograniczyć pola, które mają być wyświetlane w formularzach dodaj/edytuj. Służy do tego lista
fieldsets:
fieldsets = (
(_('Data'), {
'fields': ('category', 'name', 'description', 'order', 'use_moderators', 'moderators', 'use_prefixes', 'allow_anonymous')
}),
(_('Stats'), {'fields': ('topics', 'posts'), 'classes': ('collapse',)}),
('', {'fields': ('lastposter', 'lasttopic', 'modification_date', ), 'classes': ('collapse', 'wide')}),
)
)
Lista
fieldsets składa się z dwuelementowych list
(Nazwa_komórki, SŁOWNIK), gdzie SŁOWNIK zawiera klucz
fields z listą pól jakie mają być wyświetlane.
fields mogą służyć do ograniczenia elementów formularza jak i do podziału na "komórki" - bloki.
fieldsets = (
('Komórka 1',
{
'fields': ('pole1', 'pole2')
}
),
('Komórka 2',
{
'fields': ('pole3', 'pole4')
}
),
)
Jeżeli jakieś pole nie występuje w formularzu to przy dodawaniu wpisu będzie miał pustą wartość. W modelu pole to musi mieć
blank=True oraz zazwyczaj również
default=JAKAŚ_WARTOŚC. Dodatkowo do słownika można dodać
'classes': ('collapse',) by dana komórka-blok była zwinięta z opcją rozsunięcia (JavaScript).
- Dodany: 14.07.2008 przez riklaunim