{"title":"Γράφοντας το πρώτο σας Django app, μέρος 6","version":"1.10","locale":"el","docname":"intro/tutorial06","url":"/el/1.10/intro/tutorial06/","canonical":"https://djangodocs.dev/el/1.10/intro/tutorial06/","summary":"Ο οδηγός αυτός ξεκινά εκεί που τελειώνει ο οδηγός 5. Έχουμε φτιάξει μια γεμάτη με τεστ εφαρμογή ψηφοφορίας (Web-poll) και τώρα θα βελτιώσουμε την εμφάνιση…","html":"<h1>Γράφοντας το πρώτο σας Django app, μέρος 6<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-6\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ο οδηγός αυτός ξεκινά εκεί που τελειώνει <a class=\"reference internal\" href=\"/el/1.10/intro/tutorial05/\"><span class=\"doc\">ο οδηγός 5</span></a>. Έχουμε φτιάξει μια γεμάτη με τεστ εφαρμογή ψηφοφορίας (Web-poll) και τώρα θα βελτιώσουμε την εμφάνιση της προσθέτοντας ένα stylesheet (CSS) και μια εικόνα.</p>\n<p>Πέρα από την HTML που παράγεται από τον server, τα web applications, σε γενικές γραμμές, χρειάζονται να κάνουν serve και πρόσθετα αρχεία — όπως εικόνες, γραμματοσειρές, JavaScript αρχεία, CSS κλπ — αρχεία απαραίτητα ούτως ώστε μια πλήρης ιστοσελίδα να γίνει render. Στο Django, αναφερόμαστε σε αυτά τα αρχεία ως «static files».</p>\n<p>Για τα μικρής κλίμακας projects, αυτό δεν είναι και πολύ σημαντικό, επειδή μπορείτε να κρατήσετε αυτά τα αρχεία (τα οποία δεν θα είναι πολλά) κάπου που ο web server σας να μπορεί να τα βρει. Ωστόσο, στα μεγαλύτερης κλίμακας projects (ειδικά εκείνων που αποτελούνται από πολλά apps) που έχουν να κάνουν με πολλαπλά σετ από static files, όπου το κάθε app έχει το δικό του σετ, τα πράγματα αρχίζουν να δυσκολεύουν.</p>\n<p>Αυτό ακριβώς κάνει το <code class=\"docutils literal notranslate\">django.contrib.staticfiles</code>: συγκεντρώνει όλα τα static files από κάθε εφαρμογή σας (και οποιοδήποτε άλλο μέρος εσείς καθορίσετε) σε μια τοποθεσία (που εσείς πάλι καθορίζετε) από την οποία μπορούν εύκολα να γίνουν served σε παραγωγικό περιβάλλον (production).</p>\n<section id=\"customize-your-app-s-look-and-feel\">\n<h2>Προσαρμογή της εμφάνισης της <em>εφαρμογής</em> σας<a class=\"heading-anchor\" href=\"#customize-your-app-s-look-and-feel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Πρώτα, δημιουργήστε ένα φάκελο με το όνομα <code class=\"docutils literal notranslate\">static</code> μέσα στο φάκελο <code class=\"docutils literal notranslate\">polls</code> (μέσα, δηλαδή, στην εφαρμογή σας). Το Django θα ψάξει για τυχόν static files μέσα εκεί, ομοίως όπως ψάχνει για templates μέσα στο φάκελο <code class=\"docutils literal notranslate\">polls/templates/</code>.</p>\n<p>Η ρύθμιση του Django <a class=\"reference internal\" href=\"/el/1.10/ref/settings/#std-setting-STATICFILES_FINDERS\"><code class=\"xref std std-setting docutils literal notranslate\">STATICFILES_FINDERS</code></a> περιέχει μια λίστα από finders οι οποίοι γνωρίζουν πως να βρίσκουν τα static files από διάφορα μέρη. Μια από τις προεπιλογές είναι η <code class=\"docutils literal notranslate\">AppDirectoriesFinder</code> η οποία κοιτάζει να βρει έναν υπό-φάκελο με το όνομα «static» σε κάθε εφαρμογή η οποία συγκαταλέγεται στη λίστα της ρύθμισης <a class=\"reference internal\" href=\"/el/1.10/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> (όπως ο υπό-φάκελος που μόλις δημιουργήσαμε μέσα στην εφαρμογή <code class=\"docutils literal notranslate\">polls</code>). Το admin site χρησιμοποιεί την ίδια αρχιτεκτονική φακέλων για τα δικά του static files.</p>\n<p>Μέσα στον φάκελο <code class=\"docutils literal notranslate\">static</code> που μόλις δημιουργήσατε, δημιουργήστε άλλο έναν φάκελο με το όνομα <code class=\"docutils literal notranslate\">polls</code> και μέσα σε αυτόν δημιουργήστε ένα αρχείο με το όνομα <code class=\"docutils literal notranslate\">style.css</code>. Με άλλα λόγια, το stylesheet θα πρέπει να βρίσκεται στη διαδρομή <code class=\"docutils literal notranslate\">polls/static/polls/style.css</code>. Λόγω του τρόπου λειτουργίας του <code class=\"docutils literal notranslate\">AppDirectoriesFinder</code> staticfile finder, μπορείτε να αναφέρεστε στο αρχείο αυτό ως <code class=\"docutils literal notranslate\">polls/style.css</code>, παρόμοια με το πως αναφέρεστε στη διαδρομή (path) για τα templates σας.</p>\n<aside class=\"admonition-static-file-namespacing admonition\" role=\"note\">\n<p class=\"admonition-title\">Static file namespacing</p>\n<p>Όπως ακριβώς συμβαίνει με τα templates, θα <em>μπορούσαμε</em> να αποθηκεύαμε τα static files μας απ’ ευθείας στο φάκελο <code class=\"docutils literal notranslate\">polls/static</code> (παρά να δημιουργήσουμε άλλον έναν φάκελο μέσα εκεί με το όνομα <code class=\"docutils literal notranslate\">polls</code>), αλλά δεν θα ήταν καλή ιδέα. Το Django θα επιλέξει το πρώτο static file που θα βρει το οποίο θα ταιριάξει στο όνομα που ψάχνει. Αν έχετε ένα static file με το ίδιο όνομα σε μια <em>άλλη</em> εφαρμογή, τότε το Django δεν θα μπορέσει να διαχωρίσει ποια από τα δύο να χρησιμοποιήσει. Χρειαζόμαστε ένα τρόπο να καθοδηγήσουμε το Django στο σωστό αρχείο. Ο ευκολότερος τρόπος να το κάνουμε είναι να εφαρμόσουμε την τεχνική του <em>namespacing</em> στα static files. Δηλαδή, να τοποθετούμε αυτά τα static files μέσα σε <em>άλλον έναν</em> φάκελο με το ίδιο όνομα με αυτό της εφαρμογής.</p>\n</aside>\n<p>Τοποθετήστε τον ακόλουθο κώδικα στο αρχείο CSS (<code class=\"docutils literal notranslate\">polls/static/polls/style.css</code>):</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"css\"><figcaption class=\"code-block-caption\"><code>polls/static/polls/style.css</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Css</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=\"polls/static/polls/style.css\"><code><span class=\"nt\">li</span> <span class=\"nt\">a</span> <span class=\"p\">{</span>\n    <span class=\"k\">color</span><span class=\"p\">:</span> <span class=\"kc\">green</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>Μετά, προσθέστε τα ακόλουθα στην αρχή του αρχείου <code class=\"docutils literal notranslate\">polls/templates/polls/index.html</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>polls/templates/polls/index.html</code></figcaption><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=\"polls/templates/polls/index.html\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">static</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">link</span> <span class=\"na\">rel</span><span class=\"o\">=</span><span class=\"s\">&quot;stylesheet&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;text/css&quot;</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">static</span> <span class=\"s1\">&#39;polls/style.css&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"p\">/&gt;</span>\n</code></pre></figure>\n<p>Το template tag <code class=\"docutils literal notranslate\">{% static %}</code> παράγει το absolute URL των static files.</p>\n<p>Αυτό χρειάζεστε, μόνο, για το development. Ανανεώστε τη σελίδα <code class=\"docutils literal notranslate\">http://localhost:8000/polls/</code> και θα δείτε ότι τα question links είναι πράσινα (στυλ Django!), που σημαίνει ότι το stylesheet φορτώθηκε και διαβάστηκε επιτυχώς.</p>\n</section>\n<section id=\"adding-a-background-image\">\n<h2>Προσθέτοντας μια background-image<a class=\"heading-anchor\" href=\"#adding-a-background-image\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Επόμενο βήμα είναι να δημιουργήσουμε έναν υπό-φάκελο για τις εικόνες μας. Δημιουργήστε, λοιπόν, ένα φάκελο με το όνομα <code class=\"docutils literal notranslate\">images</code> στη διαδρομή <code class=\"docutils literal notranslate\">polls/static/polls/</code>. Μέσα σε αυτό το φάκελο αποθηκεύστε μια εικόνα με το όνομα <code class=\"docutils literal notranslate\">background.gif</code>. Με άλλα λόγια το full path της εικόνας θα είναι το <code class=\"docutils literal notranslate\">polls/static/polls/images/background.gif</code>.</p>\n<p>Μετά προσθέστε στο CSS αρχείο σας τα παρακάτω (<code class=\"docutils literal notranslate\">polls/static/polls/style.css</code>):</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"css\"><figcaption class=\"code-block-caption\"><code>polls/static/polls/style.css</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Css</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=\"polls/static/polls/style.css\"><code><span class=\"nt\">body</span> <span class=\"p\">{</span>\n    <span class=\"k\">background</span><span class=\"p\">:</span> <span class=\"kc\">white</span> <span class=\"nb\">url</span><span class=\"p\">(</span><span class=\"s2\">&quot;images/background.gif&quot;</span><span class=\"p\">)</span> <span class=\"kc\">no-repeat</span> <span class=\"kc\">right</span> <span class=\"kc\">bottom</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>Ανανεώστε τη σελίδα <code class=\"docutils literal notranslate\">http://localhost:8000/polls/</code> και θα δείτε την εικόνα κάτω δεξιά στην οθόνη.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Προειδοποίηση</p>\n<p>Είναι προφανές ότι το template tag <code class=\"docutils literal notranslate\">{% static %}</code> δεν θα είναι διαθέσιμο για static files τα οποία δεν παράγονται από το Django. Θα πρέπει πάντα να χρησιμοποιείτε <strong>relative paths</strong> για να συνδέσετε μεταξύ τους τα static files. Αν το κάνετε αυτό θα μπορείτε, έπειτα, να αλλάζετε τη ρύθμιση <a class=\"reference internal\" href=\"/el/1.10/ref/settings/#std-setting-STATIC_URL\"><code class=\"xref std std-setting docutils literal notranslate\">STATIC_URL</code></a> (η οποία χρησιμοποιείται από το <a class=\"reference internal\" href=\"/el/1.10/ref/templates/builtins/#std-templatetag-static\"><code class=\"xref std std-ttag docutils literal notranslate\">static</code></a> template tag για να δημιουργεί τα URLs) χωρίς να χρειαστεί να αλλάζετε ένα σωρό από μονοπάτια (paths) στα static files σας. Με άλλα λόγια μην χρησιμοποιείτε absolute paths για τα static files. Η δουλειά του <code class=\"docutils literal notranslate\">{% static %}</code> είναι να μετατρέπει τα relative paths σε absolute URLs.</p>\n</aside>\n<p>Αυτά είναι τα <strong>βασικά</strong>. Για περισσότερες πληροφορίες σχετικά με τις ρυθμίσεις και άλλα εργαλεία τα οποία συμπεριλαμβάνονται στο Django δείτε στο άρθρο <a class=\"reference internal\" href=\"/el/1.10/howto/static-files/\"><span class=\"doc\">διαχείριση των static files</span></a> και στο <a class=\"reference internal\" href=\"/el/1.10/ref/contrib/staticfiles/\"><span class=\"doc\">η εφαρμογή staticfiles</span></a>. Το άρθρο <a class=\"reference internal\" href=\"/el/1.10/howto/static-files/deployment/\"><span class=\"doc\">production server και static files</span></a> συζητά πως να χρησιμοποιήσετε τα static files σε ένα πραγματικό server.</p>\n<p>Όταν είστε εξοικειωμένοι με τα static files, διαβάστε το <a class=\"reference internal\" href=\"/el/1.10/intro/tutorial07/\"><span class=\"doc\">έβδομο μέρος αυτού του οδηγού</span></a> για να μάθετε περισσότερα με την παραμετροποίηση του διαχειριστικού site του Django (admin site) το οποίο δημιουργείται αυτόματα.</p>\n</section>","rootId":"writing-your-first-django-app-part-6","toc":[{"title":"Προσαρμογή της εμφάνισης της εφαρμογής σας","anchor":"customize-your-app-s-look-and-feel","children":[]},{"title":"Προσθέτοντας μια background-image","anchor":"adding-a-background-image","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Ξεκινώντας","url":"/el/1.10/intro/"}],"prev":{"docname":"intro/tutorial05","title":"Γράφοντας το πρώτο σας Django app, μέρος 5","url":"/el/1.10/intro/tutorial05/"},"next":{"docname":"intro/tutorial07","title":"Γράφοντας το πρώτο σας Django app, μέρος 7","url":"/el/1.10/intro/tutorial07/"},"formats":{"html":"/el/1.10/intro/tutorial06/","markdown":"/el/1.10/intro/tutorial06.md","json":"/el/1.10/intro/tutorial06.json"},"source":"https://github.com/django/django/blob/stable/1.10.x/docs/intro/tutorial06.txt","official":"https://docs.djangoproject.com/el/1.10/intro/tutorial06/","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","fr","ja","id","pt-br","es","el","pl"]}