Modyfikowanie Panelu Admina dla Aplikacji

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:
newdjango1
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.).

Panel Admina dla modeli

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:
newdjango2
Możemy teraz dowolnie zarządzać danymi w tych modelach.
newdjango3
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.
newdjango4

Lista wpisów

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.

Formularze Dodaj/Edytuj

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')}),
		)
)
djadm1
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).
RkBlog

Django, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact