Skip to main content

Django jQuery DataTables

Django jQuery DataTables is a Python library that integrates the popular jQuery DataTables library with Django projects. It provides a convenient way to handle and manage datatables in your Django application.

Features

  • Integration with jQuery DataTables for efficient data table handling.
  • Support for main search and individual column search.
  • Flexible column remapping for customized data filtering.
  • Pagination support for large datasets.
  • Easy serialization of data using Django serializers.

Installation

You can install Django jQuery DataTables using pip install django_jquery_datatables:

Usage

To use Django jQuery DataTables in your Django project, follow these steps:

  1. Install Django jQuery DataTables by pip install django_jquery_datatables.
  2. Import the main datatables function by using from django_jquery_datatables.utils import JqueryDatatable
  3. This JqueryDatatable is used in the view function of django, it returns all the data required by jquery datatables library in the form of JSON.

Basic Example

#####Frontend:

<table id="users_table" class="table">
    <thead>
    <tr>
        <th>Username</th>
        <th>Is Staff</th>
        <th>Is Superuser</th>
        <th>Is Active</th>
        <th>Last Login</th>
    </tr>
    </thead>
</table>
<script>
    $(document).ready(function () {
        $('#users_table').DataTable({
            dom: 'Bfrtip',
            order: [],
            orderCellsTop: true,
            "processing": true,
            "serverSide": true,
            ajax: {
                url: '/django_jquery_datatable_url/',
                type: 'GET',
                contentType: 'application/json',
            },
            columns: [
                {data: "username"},
                {data: "is_staff"},
                {data: "is_superuser"},
                {data: "is_active"},
                {data: "last_login"},
            ],
            "createdRow": function (row, data, dataIndex) {
                $(row).attr("id", data.id);
            },
            buttons: [
                'copy', 'csv', 'excel', 'pdf', 'print', 'pageLength'
            ],
            lengthMenu: [
                [10, 50, 100, 500],
                ["10 rows", "50 rows", "100 rows", "500 rows"],
            ],
            pageLength: 10,
        });
    });
</script>
Django Backend
from django.contrib.auth.models import User
from django_jquery_datatables.utils import JqueryDatatable
from rest_framework import serializers


class UsersSerializer(serializers.ModelSerializer):
    DT_RowId = serializers.IntegerField(source='id')

    class Meta:
        model = User
        exclude = ['password']


def my_view(request):
    queryset = User.objects.all()
    # You can also sort the initial data here.
    return JqueryDatatable(request, queryset, UsersSerializer)

Advance Examples

For adding search to each individual column in datatables, there is no need to change backend logic, you only need to add search to your jquery code, here is an example usage with seach at the top of every column.

<table id="users_table" class="table">
    <thead>
    <tr>
        <th>Username</th>
        <th>Is Staff</th>
        <th>Is Superuser</th>
        <th>Is Active</th>
        <th>Last Login</th>
    </tr>
    </thead>
</table>
<script>
    $(document).ready(function () {
        $('#users_table thead tr').clone(true).appendTo('#users_table thead');
        $('#users_table thead tr:eq(1) th').each(function (i) {
            var title = $(this).text();
            // Here you can specify the column names on which you do not want to add a search
            if (['Remove', 'Edit', 'Action'].includes(title)) {
                $(this).html('');
            } else {
                $(this).html(`<div class="col-xs-2"><input style="height:10px;" name="${title}" placeholder="Search" class="form-control" type="text"></div>`);
                $('input', this).on('keyup change', function () {
                    if (table.column(i).search() !== this.value) {
                        table.column(i).search(this.value).draw();
                    }
                });
            }
        });
        var table = $('#users_table').DataTable({
            dom: 'Bfrtip',
            order: [],
            orderCellsTop: true,
            "processing": true,
            "serverSide": true,
            ajax: {
                url: '/django_jquery_datatable_url/',
                type: 'GET',
                contentType: 'application/json',
            },
            columns: [
                {data: "username"},
                {data: "is_staff"},
                {data: "is_superuser"},
                {data: "is_active"},
                {data: "last_login"},
            ],
            "createdRow": function (row, data, dataIndex) {
                $(row).attr("id", data.id);
            },
            buttons: [
                'copy', 'csv', 'excel', 'pdf', 'print', 'pageLength'
            ],
            lengthMenu: [
                [10, 50, 100, 500],
                ["10 rows", "50 rows", "100 rows", "500 rows"],
            ],
            pageLength: 10,
        });
    });
</script>

Backend code remains the same as provided previously

2. Custom Columns Maping

This feature is very handful when you're having a custom field defined in your serializer which is not present in your database, by doing this search will be done using 'bar' which is present in your model.
To do this you can simple pass and array of python dict with the name of field and the model field in values.

return JqueryDatatable(request, queryset, UsersSerializer, [ {'foo': 'bar'} ])

a) Maping single column

In this example you can map one column which is defined in your serializer to any column present in your model For Example:
A field named 'foo' is defined in serializer which you want to map with a field 'bar' in your model you can map it as:

from django.contrib.auth.models import User
from django_jquery_datatables.utils import JqueryDatatable
from rest_framework import serializers

class UsersSerializer(serializers.ModelSerializer):
    DT_RowId = serializers.IntegerField(source='id')
    foo = serializers.SerializerMethodField()

    class Meta:
        model = User
        exclude = ['password']
    
    def get_foo(self, obj):
        return 'Hello World'


def my_view(request):
    queryset = User.objects.all()
    # You can also sort the initial data here.
    return JqueryDatatable(request, queryset, UsersSerializer, [
            {'foo': 'bar'},
    ])

b) Maping multiple columns

Previously we've discussed how you can map a field with one field present in models, but if there is a field defined in your serializer which is a combination of two or more other field and you want to map them to multiple fields, then you can use this method.
For Example:
If you've defined a field 'full_name' which is a combination of three field defined in your models 'first_name', 'middle_name' and 'last_name'

Models:

from django.db import models

class User(models.Model):
    first_name = models.CharField(max_length=50, null=True)
    middle_name = models.CharField(max_length=50, null=True)
    last_name = models.CharField(max_length=50, null=True)
    bar = models.CharField(max_length=50, null=True)

Serializer and View:

from django.contrib.auth.models import User
from rest_framework import serializers
from django_jquery_datatables.utils import JqueryDatatable

class UsersSerializer(serializers.ModelSerializer):
    DT_RowId = serializers.IntegerField(source='id')
    full_name = serializers.SerializerMethodField()
    foo = serializers.SerializerMethodField()

    class Meta:
        model = User
        exclude = ['password']
    
    def get_foo(self, obj):
        return 'Hello World'

    def get_full_name(self, obj):
        return f'{obj.first_name} {obj.middle_name} {obj.last_name}'

def my_view(request):
    queryset = User.objects.all()
    # You can also sort the initial data here.
    return JqueryDatatable(request, queryset, UsersSerializer, [
            {'foo': 'bar'},
            {'full_name': ['first_name', 'middle_name', 'last_name']},
    ])

Contributing

Contributions are welcome! If you find a bug or have a suggestion, please open an issue on the issue tracker.

If you want to contribute code, please fork the repository, create a new branch for your changes, and submit a pull request.

License

This library is licensed under the MIT License.

Metadata

Release files for django-jquery-datatables 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-jquery-datatables 1.1.0
File Size Uploaded
django_jquery_datatables-1.1.0.tar.gz 6.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-jquery-datatables 1.1.0
File Interpreter ABI Platform
django_jquery_datatables-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 12.7 kB

Release files / django_jquery_datatables-1.1.0.tar.gz

Download URL django_jquery_datatables-1.1.0.tar.gz
Size 6.2 kB
Tags Source
SHA-256 checksum
How to use checksums
1044b5598b5022ead8b69a3929fe891cca2ca4e960515699cf371489577cf46b
BLAKE2b-256 checksum
How to use checksums
0d92493c2aa257b0f8bcf685a85820681b93acbf0faece3034635bc8e7d85641
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.0

Release files / django_jquery_datatables-1.1.0-py3-none-any.whl

Download URL django_jquery_datatables-1.1.0-py3-none-any.whl
Size 6.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
22eb47dc33a0786859b3f3be89bc76f9b9dd8de0aeb34594cb040106376a0382
BLAKE2b-256 checksum
How to use checksums
6ce2c2b6fa4441b6507e3037e1d70bebeac92271c6629dae5b87091e687feb47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.0

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.9

2 release files

1.0.8

2 release files

1.0.6

2 release files

1.0.5

1 release file

1.0.4

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page