Usprawnianie pól wyboru za pomocą django-ajax-selects

wykorzystanie ajaksowych widżetów wyszukiwania/podpowiadania dla pól select

django-ajax-selects to aplikacja umożliwiająca zastąpienie np. w panelu admina list (pól select) dla ForeignKey i ManyToMany ajaksowymi widżetami z podpowiadaniem/wyszukiwaniem. Rozwiązuje to problem pól select z bardzo dużą ilością elementów (co spowalnia generowanie strony i jest trudne w użytku).

django-ajax-selects w akcji

Instalacja

  • Pobieramy paczkę django-ajax-selects ze strony projektu i instalujemy w systemie (python setup.py install)
  • Pobieramy widżet jquery-plugin-autocomplete
  • Do INSTALLED_APPS w settings.py dodajemy 'ajax_select'
  • W szablonach musimy zaszyć następujące pliki statyczne:
    • jquery-*.js
    • jquery.autocomplete.js
    • jquery.autocomplete.css
    • ajax_select.js
    • iconic.css (opcjonalne)
By dodać pliki statyczne do strony dodawania/edycji rekordów w panelu admina można wykorzystać konfigurację modelu zawartą w admin.py twojej aplikacji. Do klasy konfigurującej twój model (admin.ModelAdmin) dodaj podklasę Media, np. taką:
	class Media:
		js = [
			'/site_media/jquery-1.5.min.js',
			'/site_media/jquery-autocomplete/jquery.autocomplete.pack.js',
			]
		css = {
			'all': [
			'/site_media/jquery-autocomplete/jquery.autocomplete.css',
			'/site_media/jquery-autocomplete/iconic.css']
			}
Ścieżki muszą wskazywać oczywiście do istniejących plików. Plik ajax_select.js znajduje się w katalogu "js" aplikacji django-ajax-selects. Trzeba albo przenieść go do używanego "site_media", albo jeżeli korzystamy z nowego systemu plików statycznych Django 1.3 - zaimportować go przez ten system. Przy testowaniu podpiętego widżetu warto sprawdzić logi zwracane przez serwer developerski - czy przypadkiem nie brakuje jakiegoś pliku statycznego (zwracany byłby stan 404).

Konfiguracja i użytkowanie

By wykorzystać django-ajax-selects w panelu admina musimy w settings.py zdefiniować zapytania jakie będą wykorzystywane do wyszukiwania rekordów. Zapytania te umieszczamy w słowniku AJAX_LOOKUP_CHANNELS, np:
AJAX_LOOKUP_CHANNELS = {
    'ajax_related_articles' : dict(model='pages.article',search_field='title'),
}

Reguła "ajax_related_articles" będzie szukała rekordów z modelu "article" w aplikacji "pages" po wartości pola "title".

Kolejny etap to podpięcie tej reguły do modelu. Robimy to w admin.py w klasie konfigurującej model dla panelu admina. Do klasy dodajemy coś takiego:
form = make_ajax_form(Article, dict(related_articles='ajax_related_articles',))
Gdzie "Article" to nazwa modelu. Jako drugi argument make_ajax_form podajemy słownik gdzie kluczem jest nazwa pola modelu (dla którego zastosowany zostanie ajaksowy widget), a wartością nazwa reguły z settings.py. W powyższym przykładzie pole "related_articles" zostanie zastąpione ajaksowym widżetem.

Django-ajax-selects oferuje więcej - np. możliwość stosowania we własnych formularzach (nie tylko w panelu), czy też niestandardowe reguły wyszukiwania. Wszystko to opisane jest na stronie projektu.

blog comments powered by Disqus

Kategorie

Strony