Change log¶
2.1.1 (2019-09-23)¶
2.1.0 (2019-07-22)¶
- Dropped support for python 2.7 (and django 1.11).
- Removed
django_tables2.utils.ucfirst, usedjango.utils.text.capfirstinstead. - Removed
class="thead-default"from bootstrap4 template (#671) - Included columns with
visible=Falsein export (#677) - Fixed pagination when the number of pages is equal to page range plus one (#655)
2.0.6 (2019-03-26)¶
- Add optional ‘table’ kwarg to
row_attrscallables
2.0.4 (2019-01-21)¶
- The
ValueErrorraised if the QuerySet passed to a table instance did not match the value declared inMeta.modelis now turned into a warning (fixes #643) - Make sure the templates do not raise errors when
thead/tfootattributes are not defined #624 by @intiocean
2.0.3 (2018-11-11)¶
2.0.2 (2018-10-22)¶
- Make sure the value of the class attribute in
<th>has consistent ordering (fixes #627) - Make sure that pagination block is available in template regardless of pagination status #622 by @apocalyptech
2.0.1 (2018-09-13)¶
- Fixed a regression which did not allow
Table.Meta.order_byto be a list.
2.0.0 (2018-09-13)¶
Not much changed in this final version, but quite a lot if you are still on 1.21.2. Some breaking changes were introduced in version 2.0.0a0, so before upgrading from 1.21.2, please have a look through them carefully.
2.0.0b5 (2018-08-29)¶
- Change order of logic in
get_table_paginationto make sure we are able to override the paginator usingView.paginator_classattribute.
2.0.0b4 (2018-08-29)¶
- The
klassargument toTable.paginate()is renamed topaginator_class - Table views/mixins now take
ListViewattributespaginator_classandpaginate_orphansinto account.
2.0.0b2 (2018-08-27)¶
- Added the ability to change the html attributes for
thead,tbody,tfoottags #606 by @roelbouwman
2.0.0a5 (2018-07-28)¶
- Added
linkify_itemkeyword argument toManyToManyColumn, fixes #594 - Fixed an encoding issue in
README.mdpreventing installation in some environments.
2.0.0a4 (2018-07-17)¶
- Add
linkifykeyword argument to all columns, to allow wrapping the content in a<a>tag. It accepts one of these ways to define the link:Trueto use the record return value ofrecord.get_absolute_url(),- a callable to use its return value
- a dict which is passed on to
django.urls.reverse() - a (viewname, args) or (viewname, kwargs)-tuple which is also passed on to
django.urls.reverse(). Implementation should be backwards compatible, so all use ofLinkColumnandRelatedLinkColumshould still work. #590
2.0.0a3 (2018-05-24)¶
Hello from DjangoCon Europe!
2.0.0a2 (2018-04-13)¶
- Another round of template cleanup.
- Fresh screenshots
- Prevent crash in
RelatedLinkColumnfor records withoutget_absolute_url(). - Raise
ValueErrorwhenTable.Meta.model != QuerySet.Model. - Raise
TypeErrorwhen incorrect types are used forTable.Metaattributes (fixes #517) - Fix:
Table.Meta.sequencewithextra_columnscan leads toKeyError(fixes #486)
django-tables2 2.0.0a0 (2018-04-10)¶
- Cleaned up templates to add consistency in what is presented across all templates.
- Added bootstrap4.html template
- Fixed translation inconsistencies.
breaking changes 2.0.0¶
- Appearance of the paginators might be different from the current 1.x templates. Use a custom template if you need to keep the appearance the same.
- Removed the
templateargument to the table constructor, usetemplate_nameinstead. - Stopped adding column names to the class attribute of table cells (
<td>tags) by default. Previous behavior can be restored by using this method on your custom table:
class MyTable(tables.Table):
# columns
def get_column_class_names(self, classes_set, bound_column):
classes_set = super(MyTable, self).get_column_class_names(classes_set, bound_column)
classes_set.add(bound_column.name)
return classes_set
verbose_names derived from model fields are not passed throughtitle()anymore, only the first character is converted to upper case. This follows Django’s convention for verbose field names: “The convention is not to capitalize the first letter of the verbose_name. Django will automatically capitalize the first letter where it needs to.” (Fixes #475 and #491)
1.21.2 (2018-03-26)¶
- Moved table instantiation from
get_context_datatoget_tables#554 by @sdolemelipone - Pass request as kwarg to
template.render(), rather than as part of context. (fixes #552)
1.21.0 (2018-03-12)¶
- Add new method
paginated_rowstoTableto replace fallback to non-paginated rows in templates. - Prevent mutation of the template context
{% render_table %}is called from (fixes #547) Possible breaking change: the context variables of the template{% render_table %}is called from is no longer available in the table’s template. Thetablevariable has an attributecontext, which is the context of the calling template. Use{{ table.context.variable }}instead of{{ variable }}.
1.20.0 (2018-03-08)¶
1.19.0 (2018-02-02)¶
BoundColumn.attrsdoes not evaluatecurrent_valueasbool#536 by @pachewise (fixes #534)- Allow more flexible access to cell values (especially useful for django templates) (fixes #485)
1.18.0 (2018-01-27)¶
1.17.1 (2017-12-14)¶
- Fix typo in setup.py for
extras_require.
1.17.0 (2017-12-14)¶
- Dropped support for Django 1.8, 1.9 and 1.10.
- Add
extra_contextargument toTemplateColumn#509 by @ad-m - Remove unnecessary cast of record to
str#514, fixes #511 - Use
django.test.TestCasefor all tests, and remove dependency on pytest and reorganized some tests #515 - Remove traces of django-haystack tests from the tests, there were no actual tests.
1.16.0 (2017-11-27)¶
This is the last version supporting Django 1.8, 1.9 and 1.10. Django 1.8 is only supported until April 2018, so consider upgrading to Django 1.11!
- Added
tfdictionary toColumn.attrswith default values for the footer, so footers now haveclassattribute by default #501 by @mpasternak
1.15.0 (2017-11-23)¶
- Added
as=varnamekeyword argument to the{% querystring %}template tag, fixes #481 - Updated the tutorial to reflect current state of Django a bit better.
- Used
OrderedDictrather thandictas the parent forutils.AttributeDictto make the rendered html more consistent across python versions. - Allow reading column
attrsfrom a column’s attribute, allowing easier reuse of custom column attributes (fixes #241) valueandrecordare optionally passed to the column attrs callables for data rows. #503, fixes #500
1.14.2 (2017-10-30)¶
- Added a
row_countervariable to the template context inTemplateColumn(fixes #448)
1.14.1 (2017-10-30)¶
- Do not fail if
orderable=Falseis passed toManyToManyColumn()
1.14.0 (2017-10-30)¶
- Added
separatorargument toManyToManyColumn. - Allow
mark_safe()’d strings fromManyToManyColumn.tranform() - Disabled ordering on
ManyToManyColumnsby default.
1.13.0 (2017-10-17)¶
- Made positional
dataargument to the table__init__()a keyword argument to make inheritance easier. Will raise aTypeErrorif omitted.
1.12.0 (2017-10-10)¶
- Allow export file name customization #484 by @federicobond
- Fixed a bug where template columns were not rendered for pinned rows (#483 by @khirstinova, fixes #482)
1.11.0 (2017-09-15)¶
- Added Hungarian translation #471 by @hmikihth.
- Added TemplateColumn.value() and enhanced export docs (fixes #470)
- Fixed display of pinned rows if table has no data. #477 by @khirstinova
1.10.0 (2017-06-30)¶
- Added
ManyToManyColumnautomatically added forManyToManyFields.
1.9.1 (2017-06-29)¶
1.8.0 (2017-06-17)¶
- Feature: Added an
ExportMixinto export table data in various export formats (CSV, XLS, etc.) using tablib. - Defer expanding
Meta.sequencetoTable.__init__, to make sequence work in combination withextra_columns(fixes #450) - Fixed a crash when
MultiTableMixin.get_tables()returned an empty array (#454 by @pypetey
1.7.1 (2017-06-02)¶
- Call before_render when rendering with the render_table template tag (fixes #447)
1.7.0 (2017-06-01)¶
- Make
title()lazy (#443 by @ygwain, fixes #438) - Fix
__all__by populating them with the names of the items to export instead of the items themselves. - Allow adding extra columns to an instance using the
extra_columnsargument. Fixes #403, #70 - Added a hook
before_renderto allow last-minute changes to the table before rendering. - Added
BoundColumns.show()andBoundColumns.hide()to show/hide columns on an instance of aTable. - Use
<listlike>.verbose_name/.verbose_name_pluralif it exists to name the items in the list. (fixes #166)
1.6.1 (2017-05-08)¶
- Add missing pagination to the responsive bootstrap template (#440 by @tobiasmcnulty)
1.6.0 (2017-05-01)¶
- Add new template
bootstrap-responsive.htmlto generate a responsive bootstrap table. (Fixes #436)
1.5.0 (2017-04-18)¶
Full disclosure: as of april 1st, 2017, I am an employee of Zostera, as such I will continue to maintain and improve django-tables2.
- Made
TableBase.as_values()an iterator (#432 by @pziarsolo) - Added
JSONFieldfor data in JSON format. - Added
__all__indjango_tables2/__init__.pyanddjango_tables2/columns/__init__.py - Added a setting
DJANGO_TABLES2_TEMPLATEto allow project-wide overriding of the template used to render tables (fixes #434).
1.4.2 (2017-03-06)¶
1.4.1 (2017-02-27)¶
- Fix URLS to screenshots in on PyPi description (fixes #398)
- Prevent superfluous spaces when a callable
row_attrs['class']returns an empty string (#417 by @Superman8218), fixes #416)
1.4.0 (2017-02-27)¶
1.3.0 (2017-01-20)¶
- Implement method
Table.as_values()to get it’s raw values. #394 by @intiocean - Fix some compatibility issues with django 2.0 #408 by djk2
1.2.8 (2016-12-21)¶
1.2.7 (2016-12-12)¶
- Apply
titleto a column’sverbose_namewhen it is derived from a model, fixes #249. (#382 by @shawnnapora) - Update documentation after deprecation of
STATIC_URLin django (#384, by @velaia) - Cleanup of the templates, making the output more equal (#381 by @ralgozino)
- Use new location for
urlresolversin Django and add backwards compatible import (#388 by @felixxm) - Fix a bug where using
sequenceand thenexcludein a child table would result in aKeyError - Some documentation fixes and cleanups.
1.2.6 (2016-09-06)¶
- Added
get_table_kwargs()method toSingleTableMixinto allow passing custom keyword arguments to theTableconstructor. (#366 by @fritz-k) - Allow the children of
TableBaserender in the{% render_table %}template tag. (#377 by @shawnnapora) - Refactor
BoundColumnattributes 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.
1.2.5 (2016-07-30)¶
- Fixed an issue preventing the rest of the row being rendered if a
BooleanColumnwas in the table for a model without custom choices defined on the model field. (#360)
1.2.4 (2016-07-28)¶
- Added Norwegian Locale (#356 by @fanzypantz)
- Restore default pagination for
SingleTableMixin, fixes #354 (#395 by @graup)
1.2.3 (2016-07-05)¶
v1.2.2 (2016-06-04)¶
- Allow use of custom class names for ordered columns through
attrs. ( #329 by @theTarkus) - Column ordering QuerySet pass through (#330 by @theTarkus)
- Cleanup/restructuring of documentation, (#325)
- Fixed an issue where explicitly defined column options where not preserved over inheritance (#339, issue #337)
- Fixed an issue where
excludein combination withsequenceraised a KeyError (#341, issue #205)
v1.2.1 (2016-05-09)¶
- table footers (#323)
- Non-field based
LinkColumnonly renders default value if lookup fails. (#322) - Accept
textparameter inBaseLinkColumn-based columns. (#322) - Pass the table instance into SingleTableMixin’s
get_table_pagination(#320 by @georgema1982, fixes #319) - Check if the view has
paginate_bybefore before trying to access it. (fixes #326)
v1.2.0 (2016-05-02)¶
- Allow custom attributes for rows (fixes #47)
v1.1.8 (2016-05-02)¶
- Ability to change the body of the
<a>-tag, by passingtextkwarg to the columns inheriting from BaseLinkColumn (#318 by @desecho, #322) - Non-field based LinkColumn only renders default value if lookup fails and text is not set. (#322, fixes #257)
v1.1.7 (2016-04-26)¶
- Added Italian translation (#315 by @paolodina
- Added Dutch translation.
- Fixed {% blocktrans %} template whitespace issues
- Fixed errors when using a column named
items(#316) - Obey
paginate_by(fromMultipleObjectMixin) if no later pagination is defined (#242)
v1.1.6 (2016-04-02)¶
- Correct error message about request context processors for current Django (#314)
- Skipped 1.1.5 due to an error while creating the tag.
v1.1.4 (2016-03-22)¶
- Fix broken
setup.pyif Django is not installed before django-tables2 (fixes #312)
v1.1.3 (2016-03-21)¶
- Drop support for Django 1.7
- Add argument to
CheckBoxColumnto render it as checked (original PR: #208)
v1.1.2 (2016-02-16)¶
- Fix
BooleanColumnwith choices set will always render as ifTrue(#301) - Fix a bug with
TemplateColumnwhile using cached template loader (#75)
v1.1.1 (2016-01-26)¶
- Allow
Meta.fieldsto be a list as well as a tuple (#250) - Call template.render with a dict in Django >= 1.8. (#298)
- Added
RelatedLinkColumn()to render links to related objects (#297) - Remove default value from request parameter to
table.as_html()
v1.1.0 (2016-01-19)¶
- Add tests for
TimeColumn - Remove
sortableargument forTableand Column constructors and its associated methods. Deprecated since 2012. - Remove deprecated aliases for
attrsinCheckboxColumn. - Remove deprecated
OrderByTuplecmpmethod (deprecated since 2013). - Add bootstrap template and (#293, fixes #141, #285)
- Fix different html for tables with and without pagination (#293, fixes #149, #285)
- Remove
{% nospaceless %}template tag and remove wrapping template in{% spaceless %}Possible breaking change, if you use custom templates.
v1.0.7 (2016-01-03)¶
- Explicitly check if
column.verbose_nameis not None to support empty column headers (fixes #280) - Cleanup the example project to make it work with modern Django versions.
- Do not sort
QuerySetwhenorderable=False(#204 by @bmihelac) show_headerattribute onTableallows disabling the header (#175 by @kviktor)LinkColumnnow tries to callget_absolute_urlon a record if noviewnameis provided (#283, fixes #231).- Add
requestargument toTable.as_html()to allow passing correct request objects instead of poorly generated ones #282 - Add coverage reporting to build #282
- Drop support for python 3.2 (because of coverage), support ends February 2016 #282
- move
build_requestfromdjango_table2.utilstotests.utilsand amend tests #282
v1.0.6 (2015-12-29)¶
- Support for custom text value in
LinkColumn(#277 by @toudi) - Refactor
LinkColumn.render_link()to not escape twice #279 - Removed
Attrs(wrapper for dict), deprecated on 2012-09-18 - Convert README.md to rst in setup.py to make PyPI look nice (fixes #97)
v1.0.5 (2015-12-17)¶
- First version released by new maintainer @jieter
- Dropped support for Django 1.5 and 1.6, add python 3.5 with Django 1.8 and 1.9 to the build matrix (#273)
- Prevent
SingleTableViewfrom callingget_querysettwice. (fixes #155) - Don’t call managers when resolving accessors. (#214 by @mbertheau, fixes #211)
v1.0.4 (2015-05-09)¶
- Fix bug in retrieving
field.verbose_nameunder Django 1.8.
v1.0.3¶
- Remove
setup.cfgas PyPI does not actually support it, instead it is a distutils2 thing that is been discontinued.
v1.0.2¶
- Add
setup.cfgto declareREADME.mdfor PyPI.
v1.0.1¶
- Convert README to markdown so it’s formatted nicely on PyPI.
v1.0.0¶
- Travis CI builds pass.
- Added Python 3.4 support.
- Added Django 1.7 and Django 1.8 support.
- Convert tests to using
py.test.
v0.16.0¶
- Django 1.8 fixes
BoundColumn.verbose_namenow only is capitalized 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
v0.15.0¶
- Add UK, Russian, Spanish, Portuguese, and Polish translations
- Add support for computed table
attrs.
v0.14.0¶
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 favor 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.
v0.13.0¶
- Add FileColumn.
v0.12.1¶
- When resolving an accessor, all exceptions are smothered into
None.
v0.12.0¶
- 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 specialized 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
v0.11.0¶
- 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
v0.10.4¶
- Fix more bugs on Python 2.6.4, all tests now pass.
v0.10.3¶
- Fix issues for Python 2.6.4 – thanks Steve Sapovits & brianmay
- Reduce Django 1.3 dependency to Table.as_html – thanks brianmay
v0.10.2¶
- Fix MANIFEST.in to include example templates, thanks TWAC.
- Upgrade django-attest to fix problem with tests on Django 1.3.1
v0.10.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.
v0.10.0¶
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_aliasAdded
OrderByTuple.get()Deprecated
BoundColumn.sortable,Column.sortable,Table.sortable,sortableCSS class,BoundColumns.itersortable,BoundColumns.sortable; useorderableinstead ofsortable.Added
BoundColumn.is_orderedIntroduced concept of an
order by alias, see glossary in the docs for details.
v0.9.6¶
- Fix bug that caused an ordered column’s
<th>to have no HTML attributes.
v0.9.5¶
- Updated example project to add
colspanon 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
v0.9.4¶
- 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.
v0.9.3¶
- Fix regression in
SingleTableMixin. - Remove stray
printstatement.
v0.9.2¶
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 inadvertently replacing Django’s built-intitletemplate filter. BoundColumn.verbose_nameno longer doescapfirst, capitalizing is now the responsibility ofColumn.header.BoundColumn.__unicode__now usesBoundColumn.headerrather thanBoundColumn.verbose_name.
v0.9.1¶
- Fix version in
setup.py
v0.9.0¶
- 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
RequestConfigand{% querystring %}
v0.8.4¶
- Removed random ‘print’ statements.
- Tweaked
palebluetheme css to be more flexible:- removed
whitespace: no-wrap - header background image to support more than 2 rows of text
- removed
v0.8.3¶
- Fixed stupid import mistake. Tests did not pick it up due to them ignoring
ImportError.
v0.8.2¶
SingleTableViewnow inherits fromListViewwhich enables automaticfoo_list.htmltemplate name resolution (thanks dramon for reporting)render_tabletemplate tag no suppresses exceptions whenDEBUG=True
v0.8.1¶
- Fixed bug in render_table when giving it a template (issue #41)
v0.8.0¶
- Added translation support in the default template via
{% trans %} - Removed
basic_table.html,Table.as_html()now renderstable.htmlbut will clobber the query string 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
Http404exceptions are no longer raised during a call toTable.paginate(), instead it now occurs whenTable.pageis accessed- Fixed bug where a table could not be rendered more than once if it was paginated.
- Accessing
Table.pagenow returns a new page every time, rather than reusing a single object
v0.7.8¶
- 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.