NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4688 most downloaded on PyPI
Table/data-grid framework for Django
Last release 19 days ago
30 Aug 2026
Release timing varies
gaps range from 2 weeks to 1.2 years
Nearly every release is documented
notes for 59 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
15 years old
135 releases · first in 2011
Added ManyToManyColumn automatically added for ManyToManyFields.
ManyToManyColumn automatically added for ManyToManyFields.Allow customizing the value used in Table.as_values() (when using a render_ method) using a value_ method. (fixes #458)
One column per quarter.
Allow computable attrs for -tags from Table.attrs (#457, fixes #451)
Feature: Added an ExportMixin to export table data in various export formats (CSV, XLS, etc.) using tablib.
ExportMixin to export table data in various export formats (CSV, XLS, etc.) using tablib.Meta.sequence to Table.__init__, to make sequence work in combination with extra_columns (fixes #450)MultiTableMixin.get_tables() returned an empty array (#454 by @pypeteyCall before_render when rendering with the render_table template tag (fixes #447)
Make title() lazy (#443 by @ygwain, fixes #438)
title() lazy (#443 by @ygwain, fixes #438)__all__ by populating them with the names of the items to export instead of the items themselves.extra_columns argument. Fixes #403, #70before_render to allow last-minute changes to the table before rendering.BoundColumns.show() and BoundColumns.hide() to show/hide columns on an instance of a Table.<listlike>.verbose_name/.verbose_name_plural if it exists to name the items in the list. (fixes #166)Add missing pagination to the responsive bootstrap template (#440 by @tobiasmcnulty)
Add new template bootstrap-responsive.html to generate a responsive bootstrap table. (Fixes #436)
bootstrap-responsive.html to generate a responsive bootstrap table. (Fixes #436)_Full disclosure: as of april 1st, 2017, I am an employee of Zostera, as such I will continue to maintain and improve django-tables2._
Full disclosure: as of april 1st, 2017, I am an employee of Zostera, as such I will continue to maintain and improve django-tables2.
TableBase.as_values() an iterator (#432 by @pziarsolo)JSONColumn for data in JSON format.__all__ in django_tables2/__init__.py and django_tables2/columns/__init__.pyDJANGO_TABLES2_TEMPLATE to allow project-wide overriding of the template used to render tables (fixes #434).Fix URLS to screenshots in on PyPi description (fixes #398)
row_attrs['class'] returns an empty string (#417 by @Superman8218), fixes #416)Return None from Table.as_values() for missing values. #419
Implement method Table.as_values() to get it's raw values. #394 by @intiocean
Table.as_values() to get it's raw values. #394 by @intioceanDocumentation for None-column attributes #401 by @dyve
None-column attributes on child class overwrite column attributes of parent class #400 by @dyve
Update documentation after deprecation of STATIC_URL in django (#384, by @velaia)
title to a column's verbose_name when it is derived from a model, fixes #249. (#382 by @shawnnapora)STATIC_URL in django (#384, by @velaia)urlresolvers in Django and add backwards compatible import (#388 by @felixxm)sequence and then exclude in a child table would result in a KeyErrorAdded get_table_kwargs() method to SingleTableMixin to allow passing custom keyword arguments to the Table constructor. (#366 by @fritz-k)
get_table_kwargs() method to SingleTableMixin to allow passing custom keyword arguments to the Table constructor. (#366 by @fritz-k)TableBase render in the {% render_table %} template tag. (#377 by @shawnnapora)BoundColumn attributes to allow override of CSS class names, fixes #349 (#370 by @graup). Current behavior should be intact, we will change the default in the future so it will not add the column name to the list of CSS classes.Fixed an issue preventing the rest of the row being rendered if a BooleanColumn was in the table for a model without custom choices defined on the mod
BooleanColumn was in the table for a model without custom choices defined on the model field. (#360)Added Norwegian Locale (#356 by @fanzypantz)
SingleTableMixin, fixes #354 (#395 by @graup)Accept text parameter in FileColumn, analogous to LinkColumn (#343 by @graup)
Allow use of custom class names for ordered columns through attrs. ( #329 by @theTarkus)
attrs. (
#329 by @theTarkus)exclude in combination with sequence raised a KeyError (#341, issue #205)Non-field based LinkColumn only renders default value if lookup fails.
LinkColumn only renders default value if lookup fails. (#322)text parameter in BaseLinkColumn-based columns. (#322)get_table_pagination (#320 by @georgema1982, fixes #319)paginate_by before before trying to access it. (fixes #326)Allow custom attributes for rows (fixes #47)
Ability to change the body of the -tag, by passing text kwarg to the columns inheriting from BaseLinkColumn (#318 by @desecho, #322)
<a>-tag, by passing text kwarg to the columns inheriting from BaseLinkColumn (#318 by @desecho, #322)Added Italian translation (#315 by @paolodina
items (#316)paginate_by (from MultipleObjectMixin) if no later pagination is defined (#242)Correct error message about request context processors for current Django
Nothing published for this version
Fix broken setup.py if Django is not installed before django-tables2 (fixes #312)
setup.py if Django is not installed before django-tables2 (fixes #312)Add argument to CheckBoxColumn to render it as checked (original PR: #208)
CheckBoxColumn to render it as checked (original PR: #208)Fix BooleanColumn with choices set will always render as if True
BooleanColumn with choices set will always render as if True (#301)TemplateColumn while using cached template loader (#75)Allow Meta.fields to be a list as well as a tuple
Meta.fields to be a list as well as a tuple (#250)RelatedLinkColumn() to render links to related objects (#297)table.as_html()Remove {% nospaceless %} template tag and remove wrapping template in {% spaceless %} Possible breaking change, if you use custom templates.
TimeColumnsortable argument for Table and Column constructors and its associated methods. Deprecated since 2012.attrs in CheckboxColumn.OrderByTuple cmp method (deprecated since 2013).{% nospaceless %} template tag and remove wrapping template in {% spaceless %} Possible breaking change, if you use custom templates.Explicitly check if column.verbose_name is not None to support empty column headers (fixes #280)
column.verbose_name is not None to support empty column headers (fixes #280)QuerySet when orderable=False (#204 by @bmihelac)show_header attribute on Table allows disabling the header (#175 by @kviktor)LinkColumn now tries to call get_absolute_url on a record if no viewname is provided (#283, fixes #231).request argument to Table.as_html() to allow passing correct request objects instead of poorly generated ones #282build_request from django_table2.utils to tests.utils and amend tests #282Removed Attrs (wrapper for dict), deprecated on 2012-09-18
LinkColumn (#277 by @toudi)LinkColumn.render_link() to not escape twice #279Attrs (wrapper for dict), deprecated on 2012-09-18First version released by new maintainer @jieter
SingleTableView from calling get_queryset twice. (fixes #155)Fix bug in retrieving field.verbose_name under Django 1.8.
field.verbose_name under Django 1.8.Remove setup.cfg as PyPI does not actually support it, instead it is a distutils2 thing that is been discontinued.
setup.cfg as PyPI does not actually support it, instead it is a distutils2 thing that is been discontinued.Add setup.cfg to declare README.md for PyPI.
setup.cfg to declare README.md for PyPI.Convert README to markdown so it's formatted nicely on PyPI.
Added Django 1.7 and Django 1.8 support.
py.test.BoundColumn.verbose_name now only is capitalized only if no verbose_name was given. verbose_name is used verbatim.
BoundColumn.verbose_name now only is capitalized only if no verbose_name was given. verbose_name is used verbatim.Add UK, Russian, Spanish, Portuguese, and Polish translations
attrs.querystring and seturlparam template tags now require the request to be in the context (backwards incompatible) -- #127
querystring and seturlparam template tags now require the request to be in the context (backwards incompatible) -- #127- Add FileColumn.
When resolving an accessor, *all* exceptions are smothered into None.
None.Empty values are specified via Column.empty_values, by default is (None, '') (backward incompatible)
Table.page is an instance attribute (no longer @property)EmptyPage) are no longer
smothered by Table.pageTable.paginateRequestConfig can handles pagination errors silently, can be disabled
by including silent=False in the paginate argument valueDateTimeColumn and DateColumn to handle formatting datetime and time zones.BooleanColumn to handle bool valuesrender_table can now build and render a table for a QuerySet, rather than
needing to be passed a table instanceColumn.render is now skipped if the value is considered empty, the
default value is used instead. Empty values are specified via
Column.empty_values, by default is (None, '') (backward incompatible)Table.Metaalters_data during resolving. Fixes issue that would
delete all your data when a column had an accessor of deletedefault and value to context of TemplateColumnAttrs is deprecated, use dict insteadAdd URLColumn to render URLs in a data source into hyperlinks
URLColumn to render URLs in a data source into hyperlinksEmailColumn to render email addresses into hyperlinksTemplateColumn can now Django's template loaders to render from a fileFix more bugs on Python 2.6.4, all tests now pass.
Fix issues for Python 2.6.4 -- thanks Steve Sapovits & brianmay
Fix MANIFEST.in to include example templates, thanks TWAC.
Fixed support for Django 1.4's paginator (thanks @koledennix)
TableData now supports slicing and returns new TableData instances.
BoundRows now takes a single argument data (a TableData instance).get_pagination on SingleTableMixin.SingleTableMixin and SingleTableView are now importable directly from django_tables2.Renamed BoundColumn.order_by to order_by_alias and never returns None (Backwards incompatible). Templates are affected if they use something like:
Renamed BoundColumn.order_by to order_by_alias and never returns None
(Backwards incompatible). Templates are affected if they use something like:
{% querystring table.prefixed_order_by_field=column.order_by.opposite|default:column.name %}
Which should be rewritten as:
{% querystring table.prefixed_order_by_field=column.order_by_alias.next %}
Added next shortcut to OrderBy returned from BoundColumn.order_by_alias
Added OrderByTuple.get()
Deprecated BoundColumn.sortable, Column.sortable, Table.sortable,
sortable CSS class, BoundColumns.itersortable, BoundColumns.sortable; use orderable instead of sortable.
Added BoundColumn.is_ordered
Introduced concept of an order by alias, see glossary in the docs for details.
Fix bug that caused an ordered column's to have no HTML attributes.
<th> to have no HTML attributes.Table.__init__ no longer *always* calls .order_by() on QuerySets, fixes #55. This does introduce a slight backwards incompatibility. Table.order_by no…
colspan on footer cell so table border renders correctly in Webkit.Table.__init__ no longer always calls .order_by() on QuerySets, fixes #55.
This does introduce a slight backwards incompatibility. Table.order_by now has the possibility of returning None, previously it would always return an OrderByTuple.DeclarativeColumnsMetaclass.__new__ now uses `super()``Fix regression that caused column verbose_name values that were marked as safe to be escaped. Now any verbose_name values that are instances of SafeDa
Fix regression in SingleTableMixin.
SingleTableMixin.print statement.SingleTableView now uses RequestConfig. This fixes issues with order_by_field, page_field, and per_page_field not being honored.
SingleTableView now uses RequestConfig. This fixes issues with
order_by_field, page_field, and per_page_field not being honored.Table.Meta.per_page and change Table.paginate to use it as default.title template filter. It differs from Django's built-in title filter
because it operates on an individual word basis and leaves words containing
capitals untouched. Warning: use {% load ... from ... %} to avoid
inadvertently replacing Django's built-in title template filter.BoundColumn.verbose_name no longer does capfirst, capitalizing is now the
responsibility of Column.header.BoundColumn.__unicode__ now uses BoundColumn.header rather than
BoundColumn.verbose_name.- Fix version in setup.py
setup.pyRemoved random 'print' statements.
paleblue theme css to be more flexible:
whitespace: no-wrapFixed stupid import mistake. Tests did not pick it up due to them ignoring ImportError.
ImportError.Your coding agent can read these notes before it upgrades. Set up the MCP server →