]> gitweb.fperrin.net Git - djsite.git/commitdiff
Use django-ajax-selects for selecting tags and works
authorFrédéric Perrin <fred@fperrin.net>
Fri, 18 Nov 2016 00:11:24 +0000 (00:11 +0000)
committerFrédéric Perrin <fred@fperrin.net>
Fri, 18 Nov 2016 00:11:24 +0000 (00:11 +0000)
djsite/settings_common.py
djsite/urls.py
quotes/admin.py
quotes/lookups.py [new file with mode: 0644]
quotes/models.py

index ca8bacd2f24a888b9bfb3402288cc20ff63803b5..358bfc0a3a97d319608b733f0c6e152a222d1b30 100644 (file)
@@ -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
index 1fcf0d91f58620f4c56a30672d941350ae4433f5..48216942fc1514e4d9f0c8fdff053e7c197cc720 100644 (file)
@@ -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)),
index 73d0016cfa060d2ab90c8f9d633df3e78584b92b..550ec963ca928d03f68498b3f10238f55706b1be 100644 (file)
@@ -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 (file)
index 0000000..0435b11
--- /dev/null
@@ -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)
index 34695dfd9fbdb4af7852b5774d4c6ddb4ac6e7f1..5daaea842062368aa7ffa3079399035e3fcebc3d 100644 (file)
@@ -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']
-