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:
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.writerré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:
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:
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 hardcoded 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:
{% 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.