Skip to main content

Modern Django autocomplete widget using web components

Project description

Suitable Django Autocomplete

A modern, accessible autocomplete widget for Django 4.2+ built with web components. No jQuery or other JavaScript framework dependencies required.

PyPI version Python versions Django versions

Features

  • 🎯 Zero dependencies - No jQuery, no framework lock-in
  • Fully accessible - ARIA compliant with keyboard navigation
  • 🚀 Modern web components - Uses native browser APIs
  • 🔍 Smart search - Debounced search with loading states
  • 🎨 Customizable - Easy to style and extend
  • 📱 Mobile friendly - Works great on touch devices
  • 🔧 Django integration - Seamless form field integration

Installation

pip install suitable-django-autocomplete

Or with uv:

uv add suitable-django-autocomplete

Quick Start

1. Add to your Django settings

INSTALLED_APPS = [
    ...
    'suitable_django_autocomplete',
]

2. Create an autocomplete view

# views.py
from suitable_django_autocomplete import SimpleAutocompleteView

class FruitAutocompleteView(SimpleAutocompleteView):
    choices = [
        'Apple', 'Apricot', 'Banana', 'Blackberry', 'Blueberry',
        'Cherry', 'Date', 'Elderberry', 'Fig', 'Grape'
    ]

3. Add URL pattern

# urls.py
from django.urls import path
from .views import FruitAutocompleteView

urlpatterns = [
    path('autocomplete/fruits/', FruitAutocompleteView.as_view(), name='fruits-autocomplete'),
]

4. Use in your forms

# forms.py
from django import forms
from suitable_django_autocomplete import AutocompleteField

class OrderForm(forms.Form):
    favorite_fruit = AutocompleteField(
        url='/autocomplete/fruits/',
        attrs={'placeholder': 'Start typing a fruit name...'}
    )

5. Include in your templates

<!-- your_template.html -->
<form method="post">
  {% csrf_token %} {{ form.as_p }}
  <!-- This loads the required CSS and JavaScript -->
  {{ form.media }}
  <button type="submit">Submit</button>
</form>

Model-Based Autocomplete

For database-backed autocomplete, use ModelAutocompleteView:

# views.py
from django.contrib.auth.models import User
from suitable_django_autocomplete import ModelAutocompleteView

class UserAutocompleteView(ModelAutocompleteView):
    model = User
    search_fields = ['username', 'first_name', 'last_name', 'email']

    def get_queryset(self):
        # Optional: add custom filtering
        return super().get_queryset().filter(is_active=True)

# forms.py
from suitable_django_autocomplete import ModelAutocompleteField

class TaskForm(forms.ModelForm):
    assigned_to = ModelAutocompleteField(
        queryset=User.objects.filter(is_active=True),
        url='/autocomplete/users/',
        attrs={'placeholder': 'Search for a user...'}
    )

    class Meta:
        model = Task
        fields = ['title', 'assigned_to']

Advanced Usage

Custom Search Logic

class ProductAutocompleteView(ModelAutocompleteView):
    model = Product
    search_fields = ['name', 'sku', 'category__name']

    def get_queryset(self):
        qs = super().get_queryset()
        # Only show products in stock
        return qs.filter(stock__gt=0)

    def get_result_label(self, obj):
        # Customize how results are displayed
        return f"{obj.name} (SKU: {obj.sku})"

Styling

The widget uses semantic HTML and can be styled with CSS:

/* Custom styling example */
.autocomplete-container {
  position: relative;
  width: 100%;
}

.autocomplete-input {
  width: 100%;
  padding: 8px 12px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

.autocomplete-results {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background: white;
  border: 1px solid #ddd;
  border-top: none;
  max-height: 200px;
  overflow-y: auto;
  z-index: 1000;
}

.autocomplete-result {
  padding: 8px 12px;
  cursor: pointer;
}

.autocomplete-result:hover,
.autocomplete-result[aria-selected="true"] {
  background-color: #f0f0f0;
}

Browser Support

  • Chrome 61+
  • Firefox 63+
  • Safari 10.1+
  • Edge 79+

Requirements

  • Python 3.10+
  • Django 4.2+

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

suitable_django_autocomplete-0.1.0.tar.gz (10.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

suitable_django_autocomplete-0.1.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file suitable_django_autocomplete-0.1.0.tar.gz.

File metadata

File hashes

Hashes for suitable_django_autocomplete-0.1.0.tar.gz
Algorithm Hash digest
SHA256 93342c0f174aae8fb50be6f78a2d532ef31933c80f461260ef428f5c3f9d8e5f
MD5 dce871cc2312165a75a26c7ff15090ce
BLAKE2b-256 0a1e3715d5e785dd9c2400ff9312cc151aaf257908c009818fb2dfed4e741f86

See more details on using hashes here.

Provenance

The following attestation bundles were made for suitable_django_autocomplete-0.1.0.tar.gz:

Publisher: publish.yml on suitable-adventures/suitable-django-autocomplete

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file suitable_django_autocomplete-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for suitable_django_autocomplete-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fa74e031c62b41e86a4249b8649f1bff89ecced5828baf9607ccd65d7707897b
MD5 295b86508917acdfb946c95d9c3ab9a5
BLAKE2b-256 fa4cf561ec1a5ed268f01e2b031a3d1f3e5b5898e29850752846645ebc6d7f0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for suitable_django_autocomplete-0.1.0-py3-none-any.whl:

Publisher: publish.yml on suitable-adventures/suitable-django-autocomplete

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page