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_nameunder 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_namenow titlises only if no verbose_name was given.verbose_nameis 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.
querystringandseturlparamtemplate 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.pageis 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 RequestConfigcan handles pagination errors silently, can be disabled by includingsilent=Falsein thepaginateargument value
-
Add
DateTimeColumnandDateColumnto handle formattingdatetimeand timezones. -
Add
BooleanColumnto handle bool values -
render_tablecan 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.renderis 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_dataduring resolving. Fixes issue that would delete all your data when a column had an accessor ofdelete -
Add
defaultandvalueto context ofTemplateColumn -
Add cardinality indication to the pagination area of a table
-
Attrsis deprecated, usedictinstead
- Add
URLColumnto render URLs in a data source into hyperlinks - Add
EmailColumnto render email addresses into hyperlinks TemplateColumncan 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.
TableDatanow supports slicing and returns newTableDatainstances.BoundRowsnow takes a single argumentdata(aTableDatainstance). - Add support for
get_paginationonSingleTableMixin. SingleTableMixinandSingleTableVieware now importable directly fromdjango_tables2.
-
Renamed
BoundColumn.order_bytoorder_by_aliasand 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
nextshortcut toOrderByreturned fromBoundColumn.order_by_alias -
Added
OrderByTuple.get() -
Deprecated
BoundColumn.sortable,Column.sortable,Table.sortable,sortableCSS class,BoundColumns.itersortable,BoundColumns.sortable; useorderableinstead 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_bynow 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
printstatement.
SingleTableViewnow usesRequestConfig. This fixes issues withorder_by_field,page_field, andper_page_fieldnot being honored.- Add
Table.Meta.per_pageand changeTable.paginateto use it as default. - Add
titletemplate filter. It differs from Django's built-intitlefilter because it operates on an individual word basis and leaves words containing capitals untouched. Warning: use{% load ... from ... %}to avoid inadvertantly replacing Django's builtintitletemplate filter. BoundColumn.verbose_nameno longer doescapfirst, titlising is now the responsbility ofColumn.header.BoundColumn.__unicode__now usesBoundColumn.headerrather 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.
SingleTableViewnow inherits fromListViewwhich enables automaticfoo_list.htmltemplate name resolution (thanks dramon for reporting)render_tabletemplate 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.htmlbut will clobber the querystring of the current request. Use therender_tabletemplate tag instead render_tablenow supports an optional second argument -- the template to use when rendering the tableTablenow supports declaring which template to use when rendering to HTML- Django >=1.3 is now required
- Added support for using django-haystack's
SearchQuerySetas a data source - The default template
table.htmlnow 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.pageis accessed - Fixed bug where a table couldn't be rendered more than once if it was paginated
- Accessing
Table.pagenow returns a new page every time, rather than reusing a single object
- Tables now support using both
sequenceandexclude(issue #32). Sequenceclass moved todjango_tables2/utils.py.- Table instances now support modification to the
excludeproperty. - Removed
BoundColumns._spawn_columns. Table.data,Table.rows, andTable.columnsare now attributes rather than properties.
