Class Based Generic Mixins¶
Django-tables2 comes with two class based view mixins: SingleTableMixin
and
MultiTableMixin
.
A single table using SingleTableMixin
¶
SingleTableMixin
makes it trivial to incorporate a table into a view or
template.
The following view parameters are supported:
table_class
–- the table class to use, e.g.SimpleTable
, if not specified andmodel
is provided, a default table will be created on-the-fly.table_data
(orget_table_data()
) – the data used to populate the tablecontext_table_name
– the name of template variable containing the table objecttable_pagination
(orget_table_pagination
) – pagination options to pass toRequestConfig
. Settable_pagination=False
to disable pagination.get_table_kwargs()
allows the keyword arguments passed to theTable
constructor.
For example:
from django_tables2 import SingleTableView
class Person(models.Model):
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
class PersonTable(tables.Table):
class Meta:
model = Person
class PersonList(SingleTableView):
model = Person
table_class = PersonTable
The template could then be as simple as:
{% load django_tables2 %}
{% render_table table %}
Such little code is possible due to the example above taking advantage of
default values and SingleTableMixin
’s eagerness at finding data sources
when one is not explicitly defined.
Note
You don’t have to base your view on ListView
, you’re able to mix
SingleTableMixin
directly.
Multiple tables using MultiTableMixin
¶
If you need more than one table in a single view you can use MultiTableMixin
.
It manages multiple tables for you and takes care of adding the appropriate
prefixes for them. Just define a list of tables in the tables attribute:
from django_tables2 import MultiTableMixin
from django.views.generic.base import TemplateView
class PersonTablesView(MultiTableMixin, TemplateView):
template_name = "multiTable.html"
tables = [
PersonTable(qs),
PersonTable(qs, exclude=("country", ))
]
table_pagination = {
"per_page": 10
}
In the template, you get a variable tables
, which you can loop over like this:
{% load django_tables2 %}
{% for table in tables %}
{% render_table table %}
{% endfor %}