django-taggit TaggableManager

Model example

Consider such a model, using django-taggit to handle tags for a model:

from django.db import models

from taggit.managers import TaggableManager


class TestModel(models.Model):
    name = models.CharField(max_length=200)

    tags = TaggableManager()

    def __str__(self):
        return self.name

View example

Extend AlightTagAutocompleteView — a convenience subclass that overrides get_result_value() to return result.name so that TaggitAlight can match tags by name:

from dal import autocomplete

from taggit.models import Tag


class TagAutocomplete(autocomplete.AlightTagAutocompleteView):
    def get_queryset(self):
        if not self.request.user.is_authenticated:
            return Tag.objects.none()

        qs = Tag.objects.all()

        if self.q:
            qs = qs.filter(name__istartswith=self.q)

        return qs

Alternatively, extend AlightQuerySetView directly and override get_result_value() yourself:

class TagAutocomplete(autocomplete.AlightQuerySetView):
    def get_result_value(self, result):
        return result.name

Don’t forget to Register the autocomplete view.

Form example

Use TaggitAlight:

class TestForm(autocomplete.FutureModelForm):
    class Meta:
        model = TestModel
        fields = ('name',)
        widgets = {
            'tags': autocomplete.TaggitAlight(
                'your-taggit-autocomplete-url'
            )
        }