Django How to Filter QuerySets Dynamically using django-filter
This tutorial is about how to use the django-filter to add a filtering to your views
I will implement a view to search for users.
Installation
install it with pip:
pip install django-filter settings.py
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp', 'widget_tweaks', 'django_filters',# pip install django-filter https://django-filter.readthedocs.org/en/latest/ ]filters.py
#filters.py from django.contrib.auth.models import User import django_filters class UserFilter(django_filters.FilterSet): class Meta: model = User fields = ['username', 'first_name', 'last_name', ]views.py
#views.py from django.shortcuts import render, redirect from django.contrib.auth.models import User from myapp.filters import UserFilter def search(request): user_list = User.objects.all() user_filter = UserFilter(request.GET, queryset=user_list) return render(request, 'user_list.html', {'filter': user_filter})urls.py
#urls.py from django.contrib import admin from django.urls import path from myapp import views from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), url(r'^search/$', views.search, name='search'), ]user_list.html
//templates/user_list.html {% extends 'base.html' %} {% load widget_tweaks %} {% block content %} <form method="get"> <div class="well"> <h4 style="margin-top: 0">Filter</h4> <div class="row"> <div class="form-group col-sm-4 col-md-3"> {{ filter.form.username.label_tag }} {% render_field filter.form.username class="form-control" %} </div> <div class="form-group col-sm-4 col-md-3"> {{ filter.form.first_name.label_tag }} {% render_field filter.form.first_name class="form-control" %} </div> <div class="form-group col-sm-4 col-md-3"> {{ filter.form.last_name.label_tag }} {% render_field filter.form.last_name class="form-control" %} </div> </div> <button type="submit" class="btn btn-primary"> <span class="glyphicon glyphicon-search"></span> Search </button> </div> </form> <table class="table table-bordered"> <thead> <tr> <th>Username</th> <th>First name</th> <th>Last name</th> <th>Date joined</th> </tr> </thead> <tbody> {% for user in filter.qs %} <tr> <td>{{ user.username }}</td> <td>{{ user.first_name }}</td> <td>{{ user.last_name }}</td> <td>{{ user.date_joined }}</td> </tr> {% empty %} <tr> <td colspan="5">No data</td> </tr> {% endfor %} </tbody> </table> {% endblock %}templates/base.html
//templates/base.html <!DOCTYPE html> <html lang="en"> <head> {% load static %} <link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap.css' %}"/> <meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1"/> <title>{% block title %}Django How to Filter QuerySets Dynamically using django-filter{% endblock %}</title> <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet"> </head> <body> <nav class="navbar navbar-default"> <div class="container-fluid"> <a class="navbar-brand">Cairocoders</a> </div> </nav> <div class="container"> <div class="col-md-12 well"> <h3 class="text-primary">Django How to Filter QuerySets Dynamically using django-filter</h3> <hr style="border-top:1px dotted #ccc;"/> {% block content %} {% endblock %} </div> </div> <script src="{% static 'js/jquery-3.1.1.min.js' %}"></script> <script src="{% static 'js/bootstrap.min.js' %}"></script> </body> </html>