# Base Autocomplete Implementation

The project uses `django-htmx-autocomplete` with a custom base implementation to ensure consistent behavior across all autocomplete widgets.

## BaseAutocomplete Class

Located in `core/forms.py`, the `BaseAutocomplete` class provides project-wide defaults and standardization:

```python
from core.forms import BaseAutocomplete

class MyModelAutocomplete(BaseAutocomplete):
    model = MyModel
    search_attrs = ['name', 'description']
```

### Features

- **Authentication Enforcement**: Requires user authentication by default
  - Controlled via `AUTOCOMPLETE_BLOCK_UNAUTHENTICATED` setting
  - Override `auth_check()` for custom auth logic

- **Search Configuration**
  - `minimum_search_length = 2` - More responsive than default 3
  - `max_results = 10` - Optimized for performance

- **Internationalization**
  - All text strings use Django's translation system
  - Customizable messages through class attributes

### Usage Guidelines

1. Always extend `BaseAutocomplete` instead of using `autocomplete.Autocomplete` directly
2. Configure search_attrs based on your model's indexed fields
3. Use the AutocompleteWidget with proper options:

```python
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['related_field']
        widgets = {
            'related_field': AutocompleteWidget(
                ac_class=MyModelAutocomplete,
                options={
                    "multiselect": True,  # For M2M fields
                    "placeholder": "Custom placeholder..."  # Optional
                }
            )
        }
```

### Performance Considerations

- Keep `search_attrs` minimal and indexed
- Use `select_related`/`prefetch_related` in custom querysets
- Consider caching for frequently used results

### Security Notes

- Authentication required by default
- Implements proper CSRF protection via HTMX
- Rate limiting should be implemented at the web server level