- Another round of template re-cleanup.
- Fresh screenshots
- Prevent crash in
RelatedLinkColumn
for records withoutget_absolute_url()
. - Raise
ValueError
whenTable.Meta.model != QuerySet.Model
. - Raise
TypeError
when incorrect types are used forTable.Meta
attributes (fixes #517)
- Fixed translation of 'previous' for some languages (fixes #563)
- Cleaned up templates to add consistancy in what is presented accross all templates.
- Added bootstrap4.html template
- Fixed translation inconsistancies.
- 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
template
argument to the table constructor, usetemplate_name
instead. - Stopped adding column names to the class attribute of table cells (
<td>
tags) by default. Previous behaviour 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_name
s 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_data
toget_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_rows
toTable
to 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. Thetable
variable has an attributecontext
, which is the context of the calling template. Use{{ table.context.variable }}
instead of{{ variable }}
.
- Define and use
get_table_data
inMultiTableMixin
#538 by @vCra (fixes #528) - Added
{% export_url <format> %}
template tag. - Allow passing a
TableData
-derived class to the data argument of theTable
constructor, instead of a QuerySet or list of dicts.
BoundColumn.attrs
does not evaluatecurrent_value
asbool
#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.template
totemplate_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_context
argument toTemplateColumn
#509 by @ad-m - Remove unnecessary cast of record to
str
#514, fixes #511 - Use
django.test.TestCase
for 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
tf
dictionary toColumn.attrs
with default values for the footer, so footers now haveclass
attribute by default #501 by @mpasternak
- Added
as=varname
keyword argument to the{% querystring %}
template tag, fixes #481 - Updated the tutorial to reflect current state of Django a bit better.
- Used
OrderedDict
rather thandict
as the parent forutils.AttributeDict
to make the rendered html more consistant accross python versions. - Allow reading column
attrs
from a column's attribute, allowing easier reuse of custom column attributes (fixes #241) value
andrecord
are optionally passed to the column attrs callables for data rows. #503, fixes #500
- Added a
row_counter
variable to the template context inTemplateColumn
(fixes #448)
- Do not fail if
orderable=False
is passed toManyToManyColumn()
- Added
separator
argument toManyToManyColumn
. - Allow
mark_safe()
'd strings fromManyToManyColumn.tranform()
- Disabled ordering on
ManyToManyColumns
by default.
- Made positional
data
argument to the table__init__()
a keyword argument to make inheritance easier. Will raise aTypeError
if ommitted.
- Allow export filename 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
ManyToManyColumn
automatically added forManyToManyField
s.
- 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 columhn headers in
Table.as_values()
- Feature: Added an
ExportMixin
to export table data in various export formats (CSV, XLS, etc.) using tablib. - Defer expanding
Meta.sequence
toTable.__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 themself. - Allow adding extra columns to an instance using the
extra_columns
argument. Fixes #403, #70 - Added a hook
before_render
to 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_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)
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 interator (#432 by @pziarsolo) - Added
JSONField
for data in JSON format. - Added
__all__
indjango_tables2/__init__.py
anddjango_tables2/columns/__init__.py
- Added a setting
DJANGO_TABLES2_TEMPLATE
to 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
ValueError
was 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](jieter#417 by @Superman8218), fixes #416)
- Return
None
fromTable.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
title
to a column'sverbose_name
when it is derived from a model, fixes #249. (#382 by @shawnnapora) - Update documentation after deprecation of
STATIC_URL
in django (#384, by @velaia) - Cleanup of the templates, making the output more equal (#381 by @ralgozino)
- Use new location for
urlresolvers
in Django and add backwards compatible import (#388 by @felixxm) - Fix a bug where using
sequence
and thenexclude
in a child table would result in aKeyError
- Some documentation fixes and cleanups.
- Added
get_table_kwargs()
method toSingleTableMixin
to allow passing custom keyword arguments to theTable
constructor. (#366 by @fritz-k) - Allow the children of
TableBase
render in the{% render_table %}
template tag. (#377 by @shawnnapora) - Refactor
BoundColumn
attributes to allow override of CSS class names, fixes #349 (#370 by @graup). Current behaviour 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 model field. (#360)
- Added Norwegian Locale (#356 by @fanzypantz)
- Restore default pagination for
SingleTableMixin
, fixes #354 (#395 by @graup)
- Accept
text
parameter 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 passthrough (#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
exclude
in combination withsequence
raised a KeyError (#341, issue #205)
- table footers (#323)
- Non-field based
LinkColumn
only renders default value if lookup fails. (#322) - Accept
text
parameter 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_by
before before trying to access it. (fixes #326)
- Allow custom attributes for rows (fixes #47)
- Ability to change the body of the
<a>
-tag, by passingtext
kwarg 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.py
if Django is not installed before django-tables2 (fixes #312)
- Drop support for Django 1.7
- Add argument to CheckBoxColumn to render it as checked (original PR: #208)
- Fix
BooleanColumn
with choices set will always render as ifTrue
(#301) - Fix a bug with
TemplateColumn
while using cached template loader (#75)
- Allow Meta.fields to 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 param to table.as_html()
- Add tests for
TimeColumn
- Remove
sortable
argument forTable
and Column constructors and its associated methods. Deprecated since 2012. - Remove deprecated aliases for
attrs
inCheckboxColumn
. - Remove deprecated
OrderByTuple
cmp
method (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_name
is not None to support empty column headers (fixes #280) - Cleanup the example project to make it work with modern Django versions.
- Do not sort queryset when orderable=False (#204 by @bmihelac)
show_header
attribute onTable
allows disabling the header (#175 by @kviktor)LinkColumn
now tries to callget_absolute_url
on a record if noviewname
is provided (#283, fixes #231).- Add
request
argument 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 feb 2016 #282
- move
build_request
fromdjango_table2.utils
totests.utils
and 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
SingleTableView
from callingget_queryset
twice. (fixes #155) - Don't call managers when resolving accessors. (#214 by @mbertheau, fixes #211)
- 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.
- 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.