Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion taggit_autocomplete/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ def formfield(self, form_class=TagField, **kwargs):
defaults = {
"label": _("Tags"),
"help_text": _("A comma-separated list of tags."),
"required": not self.blank,
}
defaults.update(kwargs)

kwargs['widget'] = TagAutocomplete

return form_class(**kwargs)
return form_class(**defaults)
10 changes: 6 additions & 4 deletions taggit_autocomplete/views.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from django.http import HttpResponse
from django.core import serializers
from django.utils.datastructures import MultiValueDictKeyError
from django.utils import simplejson

from taggit.models import Tag

def list_tags(request):
try:
tags = Tag.objects.filter(name__istartswith=request.GET['q']).values_list('name', flat=True)
tags = Tag.objects.filter(name__icontains=request.GET['term']).values_list('name', flat=True)
except MultiValueDictKeyError:
pass

return HttpResponse('\n'.join(tags), mimetype='text/plain')
tags = list(tags)
return HttpResponse(simplejson.dumps(tags), mimetype='text/javascript')
90 changes: 72 additions & 18 deletions taggit_autocomplete/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,75 @@


class TagAutocomplete(forms.TextInput):
input_type = 'text'

def render(self, name, value, attrs=None):
list_view = reverse('taggit_autocomplete-list')
if value is not None and not isinstance(value, basestring):
value = edit_string_for_tags([o.tag for o in value.select_related("tag")])
html = super(TagAutocomplete, self).render(name, value, attrs)
js = u'<script type="text/javascript">jQuery().ready(function() { jQuery("#%s").autocomplete("%s", { multiple: true }); });</script>' % (attrs['id'], list_view)
return mark_safe("\n".join([html, js]))

class Media:
js_base_url = getattr(settings, 'TAGGIT_AUTOCOMPLETE_JS_BASE_URL','%s/jquery-autocomplete' % settings.MEDIA_URL)
css = {
'all': ('%s/jquery.autocomplete.css' % js_base_url,)
}
js = (
'%s/jquery.autocomplete.js' % js_base_url,
)
input_type = 'text'

def render(self, name, value, attrs=None):
list_view = reverse('taggit_autocomplete-list')
if value is not None and not isinstance(value, basestring):
value = edit_string_for_tags(
[o.tag for o in value.select_related("tag")])
html = super(TagAutocomplete, self).render(name, value, attrs)
# change to use new jqueryui autocomplete
js = u"""
<script type="text/javascript">
jQuery().ready(function() {
function split( val ) {
return val.split( /,\s*/ );
}
function extractLast( term ) {
return split( term ).pop();
}

$("#%(id)s")// don't navigate away from the field on tab when selecting an item
.bind( "keydown", function( event ) {
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).data( "autocomplete" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
source: function( request, response ) {
$.getJSON( "%(source)s", {
term: extractLast( request.term )
}, response );
},
search: function() {
// custom minLength
var term = extractLast( this.value );
if ( term.length < 2 ) {
return false;
}
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
var terms = split( this.value );
// remove the current input
terms.pop();
// add the selected item
terms.push( ui.item.value );
// add placeholder to get the comma-and-space at the end
terms.push( "" );
this.value = terms.join( ", " );
return false;
}
});
}
);
</script>
""" % ({'id':attrs['id'], 'source':list_view})
return mark_safe("\n".join([html, js]))

class Media:
js_base_url = getattr(settings, 'TAGGIT_AUTOCOMPLETE_JS_BASE_URL',
'%s/jquery-autocomplete' % settings.MEDIA_URL)
css = {
'all': ('%s/jquery.autocomplete.css' % js_base_url,)
}
js = (
# '%s/jquery.autocomplete.js' % js_base_url,
'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js',
'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js',
)