django-tables2 simplifies the task of turning sets of data into HTML tables. It
has native support for pagination and sorting. It does for HTML tables what
django.forms
does for HTML forms. e.g.
Its features include:
- Any iterable can be a data-source, but special support for Django querysets is included.
- The builtin UI does not rely on JavaScript.
- Support for automatic table generation based on a Django model.
- Supports custom column functionality via subclassing.
- Pagination.
- Column based table sorting.
- Template tag to enable trivial rendering to HTML.
- Generic view mixin.
Creating a table is as simple as:
import django_tables2 as tables
class SimpleTable(tables.Table):
class Meta:
model = Simple
This would then be used in a view:
def simple_list(request):
queryset = Simple.objects.all()
table = SimpleTable(queryset)
return render_to_response("simple_list.html", {"table": table},
context_instance=RequestContext(request))
And finally in the template:
{% load django_tables2 %}
{% render_table table %}
This example shows one of the simplest cases, but django-tables2 can do a lot more! Check out the documentation for more details.
If you want to build the docs from within a virtualenv, and Sphinx is installed globally, use:
make html SPHINXBUILD="python $(which sphinx-build)"
- Bump the version in
django-tables2/__init__.py
. - Update
README.rst
. - Run
python setup.py sdist upload --sign --identity=<your gpg identity>
.
- Fix bug in retrieving
field.verbose_name
under Django 1.8.
- Remove setup.cfg as PyPI doesn't actually support it, instead it's a distutils2 thing that's been discontinued.
- Add setup.cfg to declare README.md for PyPI.
- Convert README to markdown so it's formatted nicely on PyPI.
- Travis CI builds pass.
- Added Python 3.4 support.
- Added Django 1.7 and Django 1.8 support.
- Dropped Python 2.6 and 3.2 support.
- Drop Django 1.2 support
- Convert tests to using py.test.
- Django 1.8 fixes
BoundColumn.verbose_name
now titlises only if no verbose_name was given.verbose_name
is used verbatim.- Add max_length attribute to person CharField
- Add Swedish translation
- Update docs presentation on readthedocs
- Add UK, Russian, Spanish, Portuguese, and Polish translations
- Add support for computed table
attrs
.
querystring
andseturlparam
template tags now require the request to be in the context (backwards incompatible) -- #127- Add Travis CI support
- Add support for Django 1.5
- Add L10N control for columns #120 (ignored in < Django 1.3)
- Drop Python 2.6.4 support in favour of Python 3.2 support
- Non-queryset data ordering is different between Python 3 and 2. When comparing different types, their truth values are now compared before falling back to string representations of their type.
- Add FileColumn.
- When resolving an accessor, all exceptions are smothered into
None
.
-
Improve performance by removing unnecessary queries
-
Simplified pagination:
Table.page
is an instance attribute (no longer@property
)- Exceptions raised by paginators (e.g.
EmptyPage
) are no longer smothered byTable.page
- Pagination exceptions are raised by
Table.paginate
RequestConfig
can handles pagination errors silently, can be disabled by includingsilent=False
in thepaginate
argument value
-
Add
DateTimeColumn
andDateColumn
to handle formattingdatetime
and timezones. -
Add
BooleanColumn
to handle bool values -
render_table
can now build and render a table for a queryset, rather than needing to be passed a table instance -
Table columns created automatically from a model now use specialised columns
-
Column.render
is now skipped if the value is considered empty, the default value is used instead. Empty values are specified viaColumn.empty_values
, by default is(None, '')
(backward incompatible) -
Default values can now be specified on table instances or
Table.Meta
-
Accessor's now honor
alters_data
during resolving. Fixes issue that would delete all your data when a column had an accessor ofdelete
-
Add
default
andvalue
to context ofTemplateColumn
-
Add cardinality indication to the pagination area of a table
-
Attrs
is deprecated, usedict
instead
- Add
URLColumn
to render URLs in a data source into hyperlinks - Add
EmailColumn
to render email addresses into hyperlinks TemplateColumn
can now Django's template loaders to render from a file
- Fix more bugs on Python 2.6.4, all tests now pass.
- Fix issues for Python 2.6.4 -- thanks Steve Sapovits & brianmay
- Reduce Django 1.3 dependency to Table.as_html -- thanks brianmay
- Fix MANIFEST.in to include example templates, thanks TWAC.
- Upgrade django-attest to fix problem with tests on Django 1.3.1
- Fixed support for Django 1.4's paginator (thanks koledennix)
- Some juggling of internal implementation.
TableData
now supports slicing and returns newTableData
instances.BoundRows
now takes a single argumentdata
(aTableData
instance). - Add support for
get_pagination
onSingleTableMixin
. SingleTableMixin
andSingleTableView
are now importable directly fromdjango_tables2
.
-
Renamed
BoundColumn.order_by
toorder_by_alias
and never returnsNone
(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 toOrderBy
returned fromBoundColumn.order_by_alias
-
Added
OrderByTuple.get()
-
Deprecated
BoundColumn.sortable
,Column.sortable
,Table.sortable
,sortable
CSS class,BoundColumns.itersortable
,BoundColumns.sortable
; useorderable
instead ofsortable
. -
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 th to have no HTML attributes.
- Updated example project to add colspan on footer cell so table border renders correctly in Webkit.
- Fix regression that caused 'sortable' class on .
- 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 returningNone
, previously it would always return anOrderByTuple
. - DeclarativeColumnsMetaclass.new now uses super()
- Testing now requires pylint and Attest >=0.5.3
- 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 SafeData are used unmodified.
- Fix regression in
SingleTableMixin
. - Remove stray
print
statement.
SingleTableView
now usesRequestConfig
. This fixes issues withorder_by_field
,page_field
, andper_page_field
not being honored.- Add
Table.Meta.per_page
and changeTable.paginate
to use it as default. - Add
title
template filter. It differs from Django's built-intitle
filter because it operates on an individual word basis and leaves words containing capitals untouched. Warning: use{% load ... from ... %}
to avoid inadvertantly replacing Django's builtintitle
template filter. BoundColumn.verbose_name
no longer doescapfirst
, titlising is now the responsbility ofColumn.header
.BoundColumn.__unicode__
now usesBoundColumn.header
rather thanBoundColumn.verbose_name
.
- Fix version in setup.py (doh)
- Add support for column attributes (see Attrs)
- Add BoundRows.items() to yield (bound_column, cell) pairs
- Tried to make docs more concise. Much stronger promotion of using RequestConfig and {% querystring %}
- Removed random 'print' statements.
- Tweaked 'paleblue' theme css to be more flexible
- removed
whitespace: no-wrap
- header background image to support more than 2 rows of text
- removed
- Fixed stupid import mistake. Tests didn't pick it up due to them ignoring
ImportError
.
SingleTableView
now inherits fromListView
which enables automaticfoo_list.html
template name resolution (thanks dramon for reporting)render_table
template tag no suppresses exceptions whenDEBUG=True
- Fixed bug in render_table when giving it a template (issue #41)
- Added translation support in the default template via
{% trans %}
- Removed
basic_table.html
,Table.as_html()
now renderstable.html
but will clobber the querystring of the current request. Use therender_table
template tag instead render_table
now supports an optional second argument -- the template to use when rendering the tableTable
now supports declaring which template to use when rendering to HTML- Django >=1.3 is now required
- Added support for using django-haystack's
SearchQuerySet
as a data source - The default template
table.html
now includes block tags to make it easy to extend to change small pieces - Fixed table template parsing problems being hidden due to a subsequent exception being raised
- Http404 exceptions are no longer raised during a call to
Table.paginate()
, instead it now occurs whenTable.page
is accessed - Fixed bug where a table couldn't be rendered more than once if it was paginated
- Accessing
Table.page
now returns a new page every time, rather than reusing a single object
- Tables now support using both
sequence
andexclude
(issue #32). Sequence
class moved todjango_tables2/utils.py
.- Table instances now support modification to the
exclude
property. - Removed
BoundColumns._spawn_columns
. Table.data
,Table.rows
, andTable.columns
are now attributes rather than properties.