Conas aschur CSV a chruthúLink to this heading

Míníonn an doiciméad seo conas CSV (Luachanna Scartha Coma) a aschur go dinimiciúil ag úsáid radhairc Django. Chun seo a dhéanamh, is féidir leat leabharlann Python CSV nó an córas teimpléid Django a úsáid.

Leabharlann Python CSV a úsáidLink to this heading

Tagann Python le leabharlann CSV,: mod: csv. Is é an eochair chun é a úsáid le Django ná go ngníomhaíonn cumas cruthaithe CSV an mhodúil:mod: csv ar rudaí cosúil le comhad, agus is rudaí cosúil le comhad iad rudaí djangos:class: ~django.http.http.HttpResponse.

Seo sampla:

Code
import csv
from django.http import HttpResponse


def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(
        content_type="text/csv",
        headers={"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

Ba chóir go mbeadh an cód agus na tuairimí féinmhínithe, ach tá cúpla rud tuillte ag lua:

  • Faigheann an freagra cineál speisialta MIME,: mimetype: text/csv. Insíonn sé seo do bhrabhsálaithe gur comhad CSV é an doiciméad, seachas comhad HTML. Má fhágann tú é seo amach, is dócha go léirmhíníonn brabhsálaithe an t-aschur mar HTML, rud a bheidh mar thoradh air go mbeidh gobbledygook gránna, scanrúil i bhfuinneog an bhrabhsálaí.

  • Faigheann an freagra ceannteideal breise ``Content-Disposition`, ina bhfuil ainm an chomhaid CSV. Tá an t-ainm comhaid seo treallach; glaoigh air cibé rud is mian leat. Úsáidfidh brabhsálaithe é sa dialóg “Sábháil mar...”, srl.

  • Is féidir leat dul isteach sa API giniúna CSV trí freagra ``a chur ar aghaidh mar an chéad argóint chuig `csv.writer`. Tá súil ag an bhfeidhm csv.writer réad cosúil le comhad, agus:class: ~django.http.httpResponse rudaí oiriúnach don bhille.

  • I gcás gach sraith i do chomhad CSV, glaoigh ar writer.writerow`, ag rith u:term: iterable.

  • Tugann an modúl CSV aire do luachan duit, mar sin ní gá duit a bheith buartha faoi teaghráin a éalú le luachana nó camóga iontu. Pas ``writerow () ``do theagáin amh, agus déanfaidh sé an rud ceart.

Comhaid mhóra CSV a shruthúLink to this heading

Agus tú ag déileáil le tuairimí a ghineann freagraí an-mhóra, b'fhéidir gur mhaith leat smaoineamh ar django's:class: ~django.http.StreamInghttPresponse a úsáid ina ionad. Mar shampla, trí chomhad a shruthú a thógann sé tamall fada chun a ghiniúint is féidir leat cothromóir ualaigh a sheachaint ag scaoileadh nasc a d'fhéadfadh a bheith curtha amach ar shlí eile agus an freastalaí ag giniúint an freagra.

Sa sampla seo, bainimid úsáid iomlán as gineadóirí Python chun cóimeáil agus tarchur comhad mór CSV a láimhseáil go héifeachtúil:

Code
import csv

from django.http import StreamingHttpResponse


class Echo:
    """An object that implements just the write method of the file-like
    interface.
    """

    def write(self, value):
        """Write the value by returning it, instead of storing in a buffer."""
        return value


def some_streaming_csv_view(request):
    """A view that streams a large CSV file."""
    # Generate a sequence of rows. The range is based on the maximum number of
    # rows that can be handled by a single sheet in most spreadsheet
    # applications.
    rows = (["Row {}".format(idx), str(idx)] for idx in range(65536))
    pseudo_buffer = Echo()
    writer = csv.writer(pseudo_buffer)
    return StreamingHttpResponse(
        (writer.writerow(row) for row in rows),
        content_type="text/csv",
        headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'},
    )

An córas teimpléad a úsáidLink to this heading

De rogha air sin, is féidir leat an córas teimpléad: doc: Django a úsáid chun CSV a ghiniúint. </topics/templates> Tá sé seo ar leibhéal níos ísle ná an modúl áisiúil Python: MOD: csv a úsáid, ach cuirtear an réiteach i láthair anseo le haghaidh iomláine.

Is é an smaoineamh anseo liosta míreanna a chur chuig do theimpléad, agus an teimpléad a chur ar aschur na camóga in a:ttag: for lúb.

Seo sampla, a ghineann an comhad CSV céanna mar thuas:

Code
from django.http import HttpResponse
from django.template import loader


def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(
        content_type="text/csv",
        headers={"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 = {"data": csv_data}
    response.write(t.render(c))
    return response

Is é an t-aon difríocht idir an sampla seo agus an sampla roimhe seo ná go n-úsáideann an ceann seo luchtú teimpléid in ionad an modúl CSV. Tá an chuid eile den chód - mar shampla an content_type='text/csv' - mar an gcéanna.

Ansin, cruthaigh an teimpléad my_template_name.txt, leis an gcód teimpléad seo:

Django template
{% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
{% endfor %}

Athraíonn an teimpléad gearr seo thar na sonraí a thugtar agus taispeánann sé líne CSV do gach sraith. Úsáideann sé an scagaire teimpléad:tfilter: addslashes chun a chinntiú nach bhfuil aon fhadhbanna le luachana.

Formáidí téacs-bhunaithe eileLink to this heading

Tabhair faoi deara nach bhfuil an-shonrach ann maidir le CSV anseo - díreach an fhormáid aschuir ar leith. Is féidir leat ceachtar de na teicnící seo a úsáid chun aon fhormáid téacs-bhunaithe is féidir leat a aisling a aschur. Is féidir leat teicníc den chineál céanna a úsáid freisin chun sonraí dénártha treallach a ghiniúint; féach:doc: /howto/outputting-pdf mar shampla.