0
0
Djangoframework~5 mins

Search and ordering in Django

Choose your learning style9 modes available
Introduction

Search and ordering help users find and sort data easily on a website. It makes large lists simple to explore.

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.