Autocompletion for django-tagulous TagField ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that django-tagulous provides autocompletion features. Check them out, if it doesn't work for you or whatever reason then feel free to use dal_tagulous. Model example ============= Consider such a model, using `django-tagulous `_ to handle tags for a model: .. code-block:: python from django.db import models from tagulous.models import TagField class TestModel(models.Model): name = models.CharField(max_length=200) tags = TagField() def __str__(self): return self.name View example ============ The :ref:`QuerySet view` works here too: we're relying on Select2 and a QuerySet of Tag objects. However, in django-tagulous, a specific Tag model is made for every instance of the field. So we have to get the Tag model class dynamically: .. code-block:: python from dal import autocomplete class TagAutocomplete(autocomplete.Select2QuerySetView): def get_queryset(self): # Get the tag model dynamically Tag = TestModel.tags.tag_model # Don't forget to filter out results depending on the visitor ! if not self.request.is_authenticated(): return Tag.objects.none() qs = Tag.objects.all() if self.q: qs = qs.filter(name__istartswith=self.q) return self.q Don't forget to :ref:`register-view`. .. note:: For more complex filtering, refer to official documentation for the :django:label:`queryset-api`. Form example ============ As usual, we need a backend-aware widget that will make only selected choices to render initially, to avoid butchering the database. As we're using a QuerySet of Tag and Select2 in its "tag" appearance, we'll use :py:class:`~dal_select2.widgets.TagSelect2`. Also, we need a field that works with a queryset of tagulous tag, and is able to update tagulous TagField: :py:class:`~dal_tagulous.fields.TagulousField`. Finnaly, we can't use Django's ModelForm because it django-taggit's field is made to be edited in a text input with a comma-separated list of fields, which isn't what Select2 supports even in its tag mode. So, we'll use :py:class:`~dal.forms.FutureModelForm`. Example: .. code-block:: python class TestForm(autocomplete.FutureModelForm): tags = autocomplete.TagulousField( required=False, queryset=TestModel.test.tag_model.objects.all(), widget=autocomplete.TagSelect2(url='your-view-url-name'), ) class Meta: model = TestModel fields = ('name',)