From d068f1e415467bfb8e45180357f01701b56a9351 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Perrin?= Date: Fri, 18 Nov 2016 00:11:24 +0000 Subject: [PATCH] Use django-ajax-selects for selecting tags and works --- djsite/settings_common.py | 7 ++++++ djsite/urls.py | 3 +++ quotes/admin.py | 24 ++++++++++++++++++--- quotes/lookups.py | 45 +++++++++++++++++++++++++++++++++++++++ quotes/models.py | 3 +-- 5 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 quotes/lookups.py diff --git a/djsite/settings_common.py b/djsite/settings_common.py index ca8bacd..358bfc0 100644 --- a/djsite/settings_common.py +++ b/djsite/settings_common.py @@ -33,6 +33,7 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'ajax_select', 'jquery', 'tinymce', 'quotes', @@ -105,3 +106,9 @@ TINYMCE_DEFAULT_CONFIG = { 'plugins': 'table', 'valid_elements': 'a[href],b,strong,u,i,em,ul,ol,li,p,br' } + +# If jQuery or jQuery.ui are not already loaded on the page, then +# these will be loaded from CDN. +# If you want to prevent this and load your own then set AJAX_SELECT_BOOTSTRAP + +AJAX_SELECT_BOOTSTRAP = False diff --git a/djsite/urls.py b/djsite/urls.py index 1fcf0d9..4821694 100644 --- a/djsite/urls.py +++ b/djsite/urls.py @@ -19,9 +19,12 @@ from django.views.generic.base import RedirectView import quotes.views +admin.autodiscover() + urlpatterns = [ url(r'^cntrl/', include(admin.site.urls)), url(r'^tinymce/', include('tinymce.urls')), + url(r'^ajax_select/', include('ajax_select.urls')), url(r'^quotes/', include('quotes.urls', namespace='quotes')), url(r'^$', RedirectView.as_view(url='/quotes/', permanent=True)), diff --git a/quotes/admin.py b/quotes/admin.py index 73d0016..550ec96 100644 --- a/quotes/admin.py +++ b/quotes/admin.py @@ -1,29 +1,47 @@ from django.contrib import admin +from ajax_select.fields import AutoCompleteSelectField +from ajax_select.admin import AjaxSelectAdmin +from ajax_select import make_ajax_form # Register your models here. from .models import AuthorTag, WorkTag, QuoteTag, Author, Work, Quote @admin.register(Author) -class AuthorAdmin(admin.ModelAdmin): +class AuthorAdmin(AjaxSelectAdmin): fields = ('name', 'birth_date', 'death_date', 'tags', 'notes', 'pvt_notes', 'creation_date', 'last_modification', 'nb_display') readonly_fields = ('creation_date', 'last_modification', 'nb_display') + form = make_ajax_form(Author, { + 'tags': 'AuthorTag', + }) + @admin.register(Work) -class WorkAdmin(admin.ModelAdmin): +class WorkAdmin(AjaxSelectAdmin): fields = ('name', 'author', 'date', 'tags', 'notes', 'pvt_notes', 'creation_date', 'last_modification', 'nb_display') readonly_fields = ('creation_date', 'last_modification', 'nb_display') + form = make_ajax_form(Work, { + 'author': 'author', + 'tags': 'WorkTag', + }) + @admin.register(Quote) -class QuoteAdmin(admin.ModelAdmin): +class QuoteAdmin(AjaxSelectAdmin): fields = ('text', 'work', 'tags', 'notes', 'pvt_notes', 'creation_date', 'last_modification', 'nb_display') readonly_fields = ('creation_date', 'last_modification', 'nb_display') + form = make_ajax_form(Quote, { + 'work': 'work', + 'tags': 'QuoteTag', + }) +# work = AutoCompleteSelectField('work') + admin.site.register(AuthorTag) admin.site.register(WorkTag) admin.site.register(QuoteTag) diff --git a/quotes/lookups.py b/quotes/lookups.py new file mode 100644 index 0000000..0435b11 --- /dev/null +++ b/quotes/lookups.py @@ -0,0 +1,45 @@ +from django.db.models import Q + +from ajax_select import register, LookupChannel +from .models import Work, Author, QuoteTag, AuthorTag, WorkTag + +@register('work') +class WorkLookup(LookupChannel): + model = Work + + def get_query(self, q, request): + return self.model.objects.filter( + Q(name__icontains=q) | Q(author__name__icontains=q) + ).order_by('name')[:10] + + def format_item_display(self, item): + return str(item) + +@register('author') +class AuthorLookup(LookupChannel): + model = Author + + def get_query(self, q, request): + return self.model.objects.filter( + name__icontains=q + ).order_by('name')[:10] + + def format_item_display(self, item): + return str(item) + +def taglookup(tagclass): + @register(tagclass.__name__) + class Lookup(LookupChannel): + model = tagclass + + def get_query(self, q, request): + return self.model.objects.filter( + tag__icontains=q + ).order_by('tag')[:10] + + def format_item_display(self, item): + return str(item) + +taglookup(QuoteTag) +taglookup(WorkTag) +taglookup(AuthorTag) diff --git a/quotes/models.py b/quotes/models.py index 34695df..5daaea8 100644 --- a/quotes/models.py +++ b/quotes/models.py @@ -92,7 +92,7 @@ class Work(CommonData): help_text='Not implemented yet') def __unicode__(self): - return "%s: %s (%s)" % (self.author.name, self.name, self.date) + return "%s (%s)" % (self.name, self.author.name) def get_absolute_url(self): return reverse('quotes:work', args=[str(self.id)]) @@ -113,4 +113,3 @@ class Quote(CommonData): class Meta(CommonData.Meta): ordering = ['-pk'] - -- 2.43.0