diff options
Diffstat (limited to 'parts/django/docs/howto/outputting-csv.txt')
-rw-r--r-- | parts/django/docs/howto/outputting-csv.txt | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/parts/django/docs/howto/outputting-csv.txt b/parts/django/docs/howto/outputting-csv.txt deleted file mode 100644 index 46e111d..0000000 --- a/parts/django/docs/howto/outputting-csv.txt +++ /dev/null @@ -1,137 +0,0 @@ -========================== -Outputting CSV with Django -========================== - -This document explains how to output CSV (Comma Separated Values) dynamically -using Django views. To do this, you can either use the `Python CSV library`_ or -the Django template system. - -.. _Python CSV library: http://docs.python.org/library/csv.html - -Using the Python CSV library -============================ - -Python comes with a CSV library, ``csv``. The key to using it with Django is -that the ``csv`` module's CSV-creation capability acts on file-like objects, and -Django's :class:`~django.http.HttpResponse` objects are file-like objects. - -Here's an example:: - - import csv - from django.http import HttpResponse - - def some_view(request): - # Create the HttpResponse object with the appropriate CSV header. - response = HttpResponse(mimetype='text/csv') - response['Content-Disposition'] = 'attachment; filename=somefilename.csv' - - writer = csv.writer(response) - writer.writerow(['First row', 'Foo', 'Bar', 'Baz']) - writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"]) - - return response - -The code and comments should be self-explanatory, but a few things deserve a -mention: - - * The response gets a special MIME type, ``text/csv``. This tells - browsers that the document is a CSV file, rather than an HTML file. If - you leave this off, browsers will probably interpret the output as HTML, - which will result in ugly, scary gobbledygook in the browser window. - - * The response gets an additional ``Content-Disposition`` header, which - contains the name of the CSV file. This filename is arbitrary; call it - whatever you want. It'll be used by browsers in the "Save as..." - dialogue, etc. - - * Hooking into the CSV-generation API is easy: Just pass ``response`` as the - first argument to ``csv.writer``. The ``csv.writer`` function expects a - file-like object, and :class:`~django.http.HttpResponse` objects fit the - bill. - - * For each row in your CSV file, call ``writer.writerow``, passing it an - iterable object such as a list or tuple. - - * The CSV module takes care of quoting for you, so you don't have to worry - about escaping strings with quotes or commas in them. Just pass - ``writerow()`` your raw strings, and it'll do the right thing. - -Handling Unicode -~~~~~~~~~~~~~~~~ - -Python's ``csv`` module does not support Unicode input. Since Django uses -Unicode internally this means strings read from sources such as -:class:`~django.http.HttpRequest` are potentially problematic. There are a few -options for handling this: - - * Manually encode all Unicode objects to a compatible encoding. - - * Use the ``UnicodeWriter`` class provided in the `csv module's examples - section`_. - - * Use the `python-unicodecsv module`_, which aims to be a drop-in - replacement for ``csv`` that gracefully handles Unicode. - -For more information, see the Python `CSV File Reading and Writing`_ -documentation. - -.. _`csv module's examples section`: http://docs.python.org/library/csv.html#examples -.. _`python-unicodecsv module`: https://github.com/jdunck/python-unicodecsv -.. _`CSV File Reading and Writing`: http://docs.python.org/library/csv.html - -Using the template system -========================= - -Alternatively, you can use the :doc:`Django template system </topics/templates>` -to generate CSV. This is lower-level than using the convenient Python ``csv`` -module, but the solution is presented here for completeness. - -The idea here is to pass a list of items to your template, and have the -template output the commas in a :ttag:`for` loop. - -Here's an example, which generates the same CSV file as above:: - - from django.http import HttpResponse - from django.template import loader, Context - - def some_view(request): - # Create the HttpResponse object with the appropriate CSV header. - response = HttpResponse(mimetype='text/csv') - response['Content-Disposition'] = 'attachment; filename=somefilename.csv' - - # The data is hard-coded here, but you could load it from a database or - # some other source. - csv_data = ( - ('First row', 'Foo', 'Bar', 'Baz'), - ('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"), - ) - - t = loader.get_template('my_template_name.txt') - c = Context({ - 'data': csv_data, - }) - response.write(t.render(c)) - return response - -The only difference between this example and the previous example is that this -one uses template loading instead of the CSV module. The rest of the code -- -such as the ``mimetype='text/csv'`` -- is the same. - -Then, create the template ``my_template_name.txt``, with this template code: - -.. code-block:: html+django - - {% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}" - {% endfor %} - -This template is quite basic. It just iterates over the given data and displays -a line of CSV for each row. It uses the :tfilter:`addslashes` template filter to -ensure there aren't any problems with quotes. - -Other text-based formats -======================== - -Notice that there isn't very much specific to CSV here -- just the specific -output format. You can use either of these techniques to output any text-based -format you can dream of. You can also use a similar technique to generate -arbitrary binary data; see :doc:`/howto/outputting-pdf` for an example. |