- 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)
- Add optional 'table' kwarg to
row_attrscallables
- 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
- Improvements in packaging and publishing helper scripts reducing the package size considerably #630 by @wtayyeb (fixes #629)
- Documentation improvements fixing #625, #631
- 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
- Fixed a regression which did not allow
Table.Meta.order_byto be a list.
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.
- Change order of logic in
get_table_paginationto make sure we are able to override the paginator usingView.paginator_classattribute.
- The
klassargument toTable.paginate()is renamed topaginator_class - Table views/mixins now take
ListViewattributespaginator_classandpaginate_orphansinto account.
- Fixed a bug in the implementation of #606
- Added the ability to change the html attributes for
thead,tbody,tfoottags #606 by @roelbouwman
- Added
LazyPaginatorto prevent making.count()queries (#604).
- Added
linkify_itemkeyword argument toManyToManyColumn, fixes #594 - Fixed an encoding issue in
README.mdpreventing installation in some environments.
- 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
Hello from DjangoCon Europe!
- Fix table prefix being overwritten in
MultiTableView, #576 by @ETinLV, (fixes #572) - Fix
empty_textcannot be translated (fixes #579)
- 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)
- Fixed translation of 'previous' for some languages (fixes #563)
- Cleaned up templates to add consistency in what is presented across all templates.
- Added bootstrap4.html template
- Fixed translation inconsistencies.
- 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_setverbose_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)
- 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)
- Do not perform extra
COUNT()queries for non-paginated tables. Fixes #551
- 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 }}.
- Define and use
get_table_datainMultiTableMixin#538 by @vCra (fixes #528) - Added
{% export_url <format> %}template tag. - Allow passing a
TableData-derived class to the data argument of theTableconstructor, instead of a QuerySet or list of dicts.
BoundColumn.attrsdoes not evaluatecurrent_valueasbool#536 by @pachewise (fixes #534)- Allow more flexible access to cell values (especially useful for django templates) (fixes #485)
- Follow relations when detecting column type for fields in
Table.Meta.fields(fixes #498) - Renamed
Table.Meta.templatetotemplate_name(with deprecation warning for the former) #542 (fixes #520) - Added Czech translation #533 by @OndraRehounek
- Added
table_factory#532 by @ZuluPro
- Fix typo in setup.py for
extras_require.
- 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.
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
- 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
- Added a
row_countervariable to the template context inTemplateColumn(fixes #448)
- Do not fail if
orderable=Falseis passed toManyToManyColumn()
- Added
separatorargument toManyToManyColumn. - Allow
mark_safe()'d strings fromManyToManyColumn.tranform() - Disabled ordering on
ManyToManyColumnsby default.
- Made positional
dataargument to the table__init__()a keyword argument to make inheritance easier. Will raise aTypeErrorif omitted.
- 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)
- 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
- Added
ManyToManyColumnautomatically added forManyToManyFields.
- Allow customizing the value used in
Table.as_values()(when using arender_<name>method) using avalue_<name>method. (fixes #458) - Allow excluding columns from the
Table.as_values()output. (fixes #459) - Fixed unicode handling for column headers in
Table.as_values()
- 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
- Call before_render when rendering with the render_table template tag (fixes #447)
- 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)
- Add missing pagination to the responsive bootstrap template (#440 by @tobiasmcnulty)
- Add new template
bootstrap-responsive.htmlto 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.
- 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).
- Feature: Pinned rows (#411 by @djk2, fixes #406)
- Fix an issue where
ValueErrorwas raised while using a view with aget_queryset()method defined. (fix with #423 by @desecho)
- 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)
- Return
NonefromTable.as_values()for missing values. #419 - Fix ordering by custom fields, and refactor
TableData#424, fixes #413 - Revert removing
TableData.__iter__()(removed in this commit), fixes #427, #361 and #421.
- 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
- 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.
- 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.
- 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)
- Added Norwegian Locale (#356 by @fanzypantz)
- Restore default pagination for
SingleTableMixin, fixes #354 (#395 by @graup)
- Accept
textparameter inFileColumn, analogous toLinkColumn(#343 by @graup) - Fix TemplateColumn RemovedInDjango110Warning fixes #346.
- Use field name in RelatedColumnLink (#350, fixes #347)
- 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)
- 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)
- Allow custom attributes for rows (fixes #47)
- 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)
- 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)
- Correct error message about request context processors for current Django (#314)
- Skipped 1.1.5 due to an error while creating the tag.
- Fix broken
setup.pyif Django is not installed before django-tables2 (fixes #312)
- Drop support for Django 1.7
- Add argument to
CheckBoxColumnto render it as checked (original PR: #208)
- Fix
BooleanColumnwith choices set will always render as ifTrue(#301) - Fix a bug with
TemplateColumnwhile using cached template loader (#75)
- 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()
- 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.
- 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
- 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)
- 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)
- Fix bug in retrieving
field.verbose_nameunder Django 1.8.
- Remove
setup.cfgas PyPI does not actually support it, instead it is a distutils2 thing that is been discontinued.
- Add
setup.cfgto declareREADME.mdfor 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.
- Convert tests to using
py.test.
- 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
- 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 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.
- 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 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
- 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
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
- 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 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.
- Fix version in
setup.py
- 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 %}
- 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
- Fixed stupid import mistake. Tests did not 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 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
- 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.