{"title":"Εξάγοντας αρχεία CSV με το Django","version":"2.0","locale":"el","docname":"howto/outputting-csv","url":"/el/2.0/howto/outputting-csv/","canonical":"https://djangodocs.dev/el/2.0/howto/outputting-csv/","summary":"Αυτό το άρθρο εξηγεί πως να εξάγετε αρχεία CSV (Comma Separated Values), δυναμικά, χρησιμοποιώντας τα Django views. Για να το κάνετε αυτό, μπορείτε είτε να…","html":"<h1>Εξάγοντας αρχεία CSV με το Django<a class=\"heading-anchor\" href=\"#outputting-csv-with-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Αυτό το άρθρο εξηγεί πως να εξάγετε αρχεία CSV (Comma Separated Values), δυναμικά, χρησιμοποιώντας τα Django views. Για να το κάνετε αυτό, μπορείτε είτε να χρησιμοποιήσετε την βιβλιοθήκη CSV της Python ή το σύστημα template του Django.</p>\n<section id=\"using-the-python-csv-library\">\n<h2>Χρησιμοποιώντας τη βιβλιοθήκη CSV της Python<a class=\"heading-anchor\" href=\"#using-the-python-csv-library\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Η Python έρχεται με μια βιβλιοθήκη, <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">csv</span></code></a>. Το κλειδί για να την χρησιμοποιήσετε με το Django είναι ότι η δυνατότητα της δημιουργίας CSV του module <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">csv</span></code></a> ενεργεί πάνω σε objects που μοιάζουν με αρχεία και τα objects της κλάσης <a class=\"reference internal\" href=\"/el/2.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> του Django είναι objects που μοιάζουν με αρχεία.</p>\n<p>Ορίστε ένα παράδειγμα:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">csv</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create the HttpResponse object with the appropriate CSV header.</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s1\">&#39;text/csv&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Content-Disposition&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.csv&quot;&#39;</span>\n\n    <span class=\"n\">writer</span> <span class=\"o\">=</span> <span class=\"n\">csv</span><span class=\"o\">.</span><span class=\"n\">writer</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">)</span>\n    <span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"n\">writerow</span><span class=\"p\">([</span><span class=\"s1\">&#39;First row&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Foo&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Bar&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Baz&#39;</span><span class=\"p\">])</span>\n    <span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"n\">writerow</span><span class=\"p\">([</span><span class=\"s1\">&#39;Second row&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;A&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;B&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;C&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;&quot;Testing&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Here&#39;s a quote&quot;</span><span class=\"p\">])</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Παρόλο που ο κώδικας και τα σχόλια είναι αρκετά επεξηγηματικά, θα πρέπει να αναφέρουμε μερικά πράγματα:</p>\n<ul class=\"simple\">\n<li><p>Το response παίρνει έναν ειδικό τύπο MIME, <em class=\"mimetype\">text/csv</em>. Αυτό λέει στους browsers ότι το έγγραφο είναι ένα αρχείο CSV, παρά ένα αρχείο HTML. Αν δεν το προσδιορίσετε, οι browsers, πιθανόν, να ερμηνεύσουν το reponse ως ένα αρχείο HTML, που σημαίνει ότι το αποτέλεσμα θα είναι όχι μόνο άσχημο αλλά δεν θα καταλαβαίνετε τίποτα!</p></li>\n<li><p>Το response παίρνει έναν επιπλέον header με το όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Disposition</span></code>, ο οποίος περιέχει το όνομα του αρχείου CSV. Αυτό το όνομα είναι αυθαίρετο. Μπορείτε να το ονομάσετε όπως εσείς θέλετε. Θα χρησιμοποιηθεί από τους browsers στο παράθυρο διαλόγου «Αποθήκευση ως…» κλπ.</p></li>\n<li><p>Η σύνδεση με το CSV-generation API είναι εύκολη: Απλώς περάστε το <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> ως πρώτο όρισμα στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">csv.writer</span></code>. Η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">csv.writer</span></code> περιμένει ένα object τύπου αρχείου και τα objects της κλάσης <a class=\"reference internal\" href=\"/el/2.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> θα αναλάβουν τα υπόλοιπα.</p></li>\n<li><p>Για κάθε γραμμή μέσα στο αρχείο σας CSV, καλέστε τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">writer.writerow</span></code>, περνώντας της ένα iterable object όπως μια λίστα ή ένα tuple.</p></li>\n<li><p>Το CSV module τακτοποιεί τους χαρακτήρες των εισαγωγικών (<code class=\"docutils literal notranslate\"><span class=\"pre\">’’</span></code> ή <code class=\"docutils literal notranslate\"><span class=\"pre\">””</span></code>) για εσάς. Οπότε, δεν χρειάζεται να ανησυχείτε για τυχόν escaping των strings σας με εισαγωγικά ή κόμματα μέσα σε αυτά. Απλώς, περάστε τα στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">writerow()</span></code> ως έχουν και όλα θα τακτοποιηθούν αυτόματα.</p></li>\n</ul>\n<section id=\"streaming-large-csv-files\">\n<span id=\"streaming-csv-files\"></span><h3>Κάνοντας streaming σε μεγάλα αρχεία CSV<a class=\"heading-anchor\" href=\"#streaming-large-csv-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Όταν έχουμε views τα οποία παράγουν πολύ μεγάλα responses, ίσως θα θέλατε να χρησιμοποιήσετε το <a class=\"reference internal\" href=\"/el/2.0/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a> του Django. Για παράδειγμα, όταν κάνετε streaming ένα αρχείο το οποίο παίρνει αρκετή ώρα για να παραχθεί, μπορείτε να αποφύγετε την διακοπή σύνδεσης του load balancer (Error 522: Connection timed out) που θα προέκυπτε όσο ο server σας παράγει το response.</p>\n<p>Σε αυτό το παράδειγμα, χρησιμοποιούμε αμιγώς τους Python generators για να χειριστούμε αποδοτικά την συναρμολόγηση και εκπομπή ενός μεγάλου, σε μέγεθος, αρχείου CSV:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">csv</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">StreamingHttpResponse</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Echo</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;An object that implements just the write method of the file-like</span>\n<span class=\"sd\">    interface.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Write the value by returning it, instead of storing in a buffer.&quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_streaming_csv_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;A view that streams a large CSV file.&quot;&quot;&quot;</span>\n    <span class=\"c1\"># Generate a sequence of rows. The range is based on the maximum number of</span>\n    <span class=\"c1\"># rows that can be handled by a single sheet in most spreadsheet</span>\n    <span class=\"c1\"># applications.</span>\n    <span class=\"n\">rows</span> <span class=\"o\">=</span> <span class=\"p\">([</span><span class=\"s2\">&quot;Row </span><span class=\"si\">{}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">idx</span><span class=\"p\">),</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">idx</span><span class=\"p\">)]</span> <span class=\"k\">for</span> <span class=\"n\">idx</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">65536</span><span class=\"p\">))</span>\n    <span class=\"n\">pseudo_buffer</span> <span class=\"o\">=</span> <span class=\"n\">Echo</span><span class=\"p\">()</span>\n    <span class=\"n\">writer</span> <span class=\"o\">=</span> <span class=\"n\">csv</span><span class=\"o\">.</span><span class=\"n\">writer</span><span class=\"p\">(</span><span class=\"n\">pseudo_buffer</span><span class=\"p\">)</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">StreamingHttpResponse</span><span class=\"p\">((</span><span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"n\">writerow</span><span class=\"p\">(</span><span class=\"n\">row</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">row</span> <span class=\"ow\">in</span> <span class=\"n\">rows</span><span class=\"p\">),</span>\n                                     <span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s2\">&quot;text/csv&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Content-Disposition&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.csv&quot;&#39;</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"using-the-template-system\">\n<h2>Χρησιμοποιώντας το σύστημα template του Django<a class=\"heading-anchor\" href=\"#using-the-template-system\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το <a class=\"reference internal\" href=\"/el/2.0/topics/templates/\"><span class=\"doc\">σύστημα template του Django</span></a> για να δημιουργήσετε CSV αρχεία. Αυτή η μέθοδος είναι χαμηλού επιπέδου (low-level) εν συγκρίσει με τη χρήση του, βολικού, module <a class=\"reference external\" href=\"https://docs.python.org/3/library/csv.html#module-csv\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">csv</span></code></a> της Python, αλλά παρουσιάζεται εδώ για λόγους πληρότητας.</p>\n<p>Η ιδέα εδώ είναι να περάσετε μια λίστα από items στο template σας και να βάλετε το template να εισάγει τα κόμματα μέσα σε ένα βρόγχο επανάληψης, <a class=\"reference internal\" href=\"/el/2.0/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">for</span></code></a>.</p>\n<p>Εδώ φαίνεται ένα παράδειγμα, στο οποίο παράγεται το ίδιο αρχείο CSV όπως παραπάνω:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Context</span><span class=\"p\">,</span> <span class=\"n\">loader</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create the HttpResponse object with the appropriate CSV header.</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s1\">&#39;text/csv&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Content-Disposition&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.csv&quot;&#39;</span>\n\n    <span class=\"c1\"># The data is hard-coded here, but you could load it from a database or</span>\n    <span class=\"c1\"># some other source.</span>\n    <span class=\"n\">csv_data</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;First row&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Foo&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Bar&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Baz&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;Second row&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;A&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;B&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;C&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;&quot;Testing&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Here&#39;s a quote&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">loader</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s1\">&#39;my_template_name.txt&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">Context</span><span class=\"p\">({</span>\n        <span class=\"s1\">&#39;data&#39;</span><span class=\"p\">:</span> <span class=\"n\">csv_data</span><span class=\"p\">,</span>\n    <span class=\"p\">})</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Η μόνη διαφορά αυτού του παραδείγματος με το προηγούμενο είναι ότι αυτό χρησιμοποιεί το template loading αντί του CSV module. Ο υπόλοιπος κώδικας – όπως το <code class=\"docutils literal notranslate\"><span class=\"pre\">content_type='text/csv'</span></code> – παραμένει ο ίδιος.</p>\n<p>Έπειτα, δημιουργήστε ένα template <code class=\"docutils literal notranslate\"><span class=\"pre\">my_template_name.txt</span></code>, με τον template κώδικα, ως εξής:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">row</span> <span class=\"k\">in</span> <span class=\"nv\">data</span> <span class=\"cp\">%}</span>&quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.0</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.1</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.2</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.3</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;, &quot;<span class=\"cp\">{{</span> <span class=\"nv\">row.4</span><span class=\"o\">|</span><span class=\"nf\">addslashes</span> <span class=\"cp\">}}</span>&quot;\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Αυτό το template είναι αρκετά απλό. Απλώς κάνει iterate πάνω στα δοσμένα δεδομένα (<code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code>) και εμφανίζει μια γραμμή CSV για κάθε γραμμή. Χρησιμοποιεί το φίλτρο <a class=\"reference internal\" href=\"/el/2.0/ref/templates/builtins/#std-templatefilter-addslashes\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">addslashes</span></code></a> για την επιβεβαίωση μη ύπαρξης προβλημάτων με τυχόν μονά ή διπλά εισαγωγικά.</p>\n</section>\n<section id=\"other-text-based-formats\">\n<h2>Άλλες μορφές τύπου κειμένου<a class=\"heading-anchor\" href=\"#other-text-based-formats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Όπως είδατε, δεν υπάρχει κάτι συγκεκριμένο με το CSV εδώ – απλώς μια συγκεκριμένη μορφή εξόδου. Μπορείτε να χρησιμοποιήσετε τις ανωτέρω τεχνικές για να εξάγετε οποιαδήποτε μορφή τύπου κειμένου εσείς θέλετε. Μπορείτε, επίσης, να χρησιμοποιήσετε μια παρόμοια τεχνική για να παράγετε αυθαίρετα δυαδικά δεδομένα. Δείτε στο άρθρο <a class=\"reference internal\" href=\"/el/2.0/howto/outputting-pdf/\"><span class=\"doc\">εξάγοντας αρχεία PDF με το Django</span></a> για ένα παράδειγμα.</p>\n</section>","rootId":"outputting-csv-with-django","toc":[{"title":"Χρησιμοποιώντας τη βιβλιοθήκη CSV της Python","anchor":"using-the-python-csv-library","children":[{"title":"Κάνοντας streaming σε μεγάλα αρχεία CSV","anchor":"streaming-large-csv-files","children":[]}]},{"title":"Χρησιμοποιώντας το σύστημα template του Django","anchor":"using-the-template-system","children":[]},{"title":"Άλλες μορφές τύπου κειμένου","anchor":"other-text-based-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Οδηγοί «Πως-να»","url":"/el/2.0/howto/"}],"prev":{"docname":"howto/legacy-databases","title":"Ενσωματώνοντας το Django με μια legacy database","url":"/el/2.0/howto/legacy-databases/"},"next":{"docname":"howto/outputting-pdf","title":"Εξάγοντας αρχεία PDF με το Django","url":"/el/2.0/howto/outputting-pdf/"},"formats":{"html":"/el/2.0/howto/outputting-csv/","markdown":"/el/2.0/howto/outputting-csv.md","json":"/el/2.0/howto/outputting-csv.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/howto/outputting-csv.txt","official":"https://docs.djangoproject.com/el/2.0/howto/outputting-csv/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}