Search and ordering help users find and sort data easily on a website. It makes large lists simple to explore.
0
0
Search and ordering in Django
Introduction
You have a list of products and want users to find items by name.
You want to let users sort blog posts by date or popularity.
You have a table of users and want to search by email or username.
You want to add filters to a list of events by location or date.
Syntax
Django
from django.views.generic import ListView class MyListView(ListView): model = MyModel template_name = 'myapp/list.html' paginate_by = 10 def get_queryset(self): queryset = super().get_queryset() search = self.request.GET.get('search', '') order = self.request.GET.get('order', '') if search: queryset = queryset.filter(name__icontains=search) if order: queryset = queryset.order_by(order) return queryset
Use get_queryset to customize search and ordering.
Use filter with __icontains for case-insensitive search.
Examples
Search items where the title contains the search text, ignoring case.
Django
search = self.request.GET.get('search', '') if search: queryset = queryset.filter(title__icontains=search)
Order the results by the field name given in the URL parameter.
Django
order = self.request.GET.get('order', '') if order: queryset = queryset.order_by(order)
Search inside a related model's field (category name).
Django
queryset = queryset.filter(category__name__icontains=search)Sample Program
This example shows a product list that users can search by name and order by name or price. It uses safe ordering by checking allowed fields.
Django
from django.views.generic import ListView from django.db import models class Product(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=6, decimal_places=2) class ProductListView(ListView): model = Product template_name = 'products.html' paginate_by = 5 def get_queryset(self): queryset = super().get_queryset() search = self.request.GET.get('search', '') order = self.request.GET.get('order', '') if search: queryset = queryset.filter(name__icontains=search) if order in ['name', '-name', 'price', '-price']: queryset = queryset.order_by(order) return queryset
OutputSuccess
Important Notes
Always validate ordering fields to avoid errors or security issues.
Use pagination to keep pages fast and user-friendly.
Search with icontains is simple but may be slow on large data sets; consider full-text search for big projects.
Summary
Search and ordering let users find and sort data easily.
Override get_queryset in Django ListView to add search and order logic.
Validate inputs and use pagination for better performance and security.