mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 10:11:09 -05:00
121 lines
3.4 KiB
Markdown
121 lines
3.4 KiB
Markdown
# Site-Wide Search System Architecture
|
|
|
|
## 1. Architectural Overview
|
|
- **Filter-First Approach**: Utilizes django-filter for robust filtering capabilities
|
|
- **Modular Design**:
|
|
```python
|
|
# filters.py
|
|
class ParkFilter(django_filters.FilterSet):
|
|
search = django_filters.CharFilter(method='filter_search')
|
|
|
|
class Meta:
|
|
model = Park
|
|
fields = {
|
|
'state': ['exact', 'in'],
|
|
'rating': ['gte', 'lte'],
|
|
}
|
|
|
|
def filter_search(self, queryset, name, value):
|
|
return queryset.filter(
|
|
Q(name__icontains=value) |
|
|
Q(description__icontains=value)
|
|
)
|
|
```
|
|
|
|
## 2. Enhanced Backend Components
|
|
|
|
### Search Endpoint (`/search/`)
|
|
```python
|
|
# views.py
|
|
class AdaptiveSearchView(TemplateView):
|
|
template_name = "search/results.html"
|
|
|
|
def get_queryset(self):
|
|
return Park.objects.all()
|
|
|
|
def get_filterset(self):
|
|
return ParkFilter(self.request.GET, queryset=self.get_queryset())
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
filterset = self.get_filterset()
|
|
context['results'] = filterset.qs
|
|
context['filters'] = filterset.form
|
|
return context
|
|
```
|
|
|
|
## 3. Plugin Integration
|
|
|
|
### Recommended django-filter Extensions
|
|
```python
|
|
# settings.py
|
|
INSTALLED_APPS += [
|
|
'django_filters',
|
|
'django_filters_addons', # For custom widgets
|
|
'rangefilter', # For date/number ranges
|
|
]
|
|
|
|
# filters.py
|
|
class EnhancedParkFilter(ParkFilter):
|
|
rating_range = django_filters.RangeFilter(field_name='rating')
|
|
features = django_filters.MultipleChoiceFilter(
|
|
field_name='features__slug',
|
|
widget=HorizontalCheckboxSelectMultiple,
|
|
lookup_expr='contains'
|
|
)
|
|
|
|
class Meta(ParkFilter.Meta):
|
|
fields = ParkFilter.Meta.fields + ['rating_range', 'features']
|
|
```
|
|
|
|
## 4. Frontend Filter Rendering
|
|
```html
|
|
<!-- templates/search/filters.html -->
|
|
<form hx-get="/search/" hx-target="#search-results" hx-swap="outerHTML">
|
|
{{ filters.form.as_p }}
|
|
<button type="submit">Apply Filters</button>
|
|
</form>
|
|
|
|
<!-- Dynamic filter updates -->
|
|
<div hx-trigger="filter-update from:body"
|
|
hx-get="/search/filters/"
|
|
hx-swap="innerHTML">
|
|
</div>
|
|
```
|
|
|
|
## 5. Benefits of django-filter Integration
|
|
- Built-in validation for filter parameters
|
|
- Automatic form generation
|
|
- Complex lookup expressions
|
|
- Reusable filter components
|
|
- Plugin ecosystem support
|
|
|
|
## 6. Security Considerations
|
|
- Input sanitization using django's built-in escaping
|
|
- Query parameter whitelisting via FilterSet definitions
|
|
- Rate limiting on autocomplete endpoint (using django-ratelimit)
|
|
- Permission-aware queryset filtering
|
|
|
|
## 7. Performance Optimization
|
|
- Select related/prefetch_related in FilterSet querysets
|
|
- Caching filter configurations
|
|
- Indexing recommendations for filtered fields
|
|
- Pagination integration with django-filter
|
|
|
|
## 8. Testing Strategy
|
|
- FilterSet validation tests
|
|
- HTMX interaction tests
|
|
- Cross-browser filter UI tests
|
|
- Performance load testing
|
|
|
|
## 9. Style Integration
|
|
- Custom filter form templates matching Tailwind design
|
|
- Responsive filter controls grid
|
|
- Accessible form labels and error messages
|
|
- Dark mode support
|
|
|
|
## 10. Expansion Framework
|
|
- Registry pattern for adding new FilterSets
|
|
- Dynamic filter discovery system
|
|
- Plugin configuration templates
|
|
- Analytics integration points |