With django-tables2-reports you can get a report (CSV, XLS) of any table with minimal changes to your project
- django (>=1.3)
- django-tables2 (>=0.11.0, tested with 0.14.0)
- xlwt (>=0.7.5), openpyxl (>=1.6.2) or pyExcelerator (>=0.6.4.1) (These are optionals, to export to xls. Default to xlwt if available)
If you use python3, and you want export to xls use this version of the xlwt (fork) (0.8.0) if this pull request is not merged still , or use openpyxl
- In your settings:
INSTALLED_APPS = (
'django_tables2_reports',
)
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.static',
)
# This is optional
EXCEL_SUPPORT = 'xlwt' # or 'openpyxl' or 'pyexcelerator'
1.a Now your table should extend of 'TableReport'
############### Before ###################
import django_tables2 as tables
class MyTable(tables.Table):
...
############### Now ######################
from django_tables2_reports.tables import TableReport
class MyTable(TableReport):
...
1.b If you want to exclude some columns from report (e.g. if it is a column of buttons), you should set 'exclude_from_report' - the names of columns (as well as property 'exclude' in table)
class MyTable(TableReport):
class Meta:
exclude_from_report = ('column1', ...)
...
2.a. If you use a traditional views, now you should use other RequestConfig and change a little your view:
############### Before ###################
from django_tables2 import RequestConfig
def my_view(request):
objs = ....
table = MyTable(objs)
RequestConfig(request).configure(table)
return render_to_response('app1/my_view.html',
{'table': table},
context_instance=RequestContext(request))
############### Now ######################
from django_tables2_reports.config import RequestConfigReport as RequestConfig
from django_tables2_reports.utils import create_report_http_response
def my_view(request):
objs = ....
table = MyTable(objs)
table_to_report = RequestConfig(request).configure(table)
if table_to_report:
return create_report_http_response(table_to_report, request)
return render_to_response('app1/my_view.html',
{'table': table},
context_instance=RequestContext(request))
If you have a lot of tables in your project, you can activate the middleware, and you do not have to change your views, only the RequestConfig import
# In your settings
MIDDLEWARE_CLASSES = (
'django_tables2_reports.middleware.TableReportMiddleware',
)
############### Now (with middleware) ######################
from django_tables2_reports.config import RequestConfigReport as RequestConfig
def my_view(request):
objs = ....
table = MyTable(objs)
RequestConfig(request).configure(table)
return render_to_response('app1/my_view.html',
{'table': table},
context_instance=RequestContext(request))
2.b. If you use a Class-based views:
############### Before ###################
from django_tables2.views import SingleTableView
class PhaseChangeView(SingleTableView):
table_class = MyTable
model = MyModel
############### Now ######################
from django_tables2_reports.views import ReportTableView
class PhaseChangeView(ReportTableView):
table_class = MyTable
model = MyModel
Under the table appear a CSV icon (and XLS icon if you have xlwt, openpyxl or pyExcelerator in your python path), if you click in this icon, you get a CSV report (or xls report) with every item of the table (without pagination). The ordering works!
You can get the last bleeding edge version of django-tables2-reports by doing a clone of its git repository:
git clone https://github.com/goinnn/django-tables2-reports
In the source tree, you will find a directory called 'test_project'. It contains a readily setup project that uses django-tables2-reports. You can run it as usual:
python manage.py syncdb --noinput
python manage.py runserver