{"title":"Γράφοντας το πρώτο σας Django app, μέρος 7","version":"3.0","locale":"el","docname":"intro/tutorial07","url":"/el/3.0/intro/tutorial07/","canonical":"https://djangodocs.dev/el/3.0/intro/tutorial07/","summary":"Καλώς ορίσατε στο τελευταίο μέρος του οδηγού (tutorial) του Django! Ο οδηγός αυτός ξεκινά εκεί που τελειώνει ο οδηγός 6 . Συνεχίζουμε με την εφαρμογή μας (Web-poll)…","html":"<h1>Γράφοντας το πρώτο σας Django app, μέρος 7<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-7\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Καλώς ορίσατε στο τελευταίο μέρος του οδηγού (tutorial) του Django! Ο οδηγός αυτός ξεκινά εκεί που τελειώνει <a class=\"reference internal\" href=\"/el/3.0/intro/tutorial06/\"><span class=\"doc\">ο οδηγός 6</span></a>. Συνεχίζουμε με την εφαρμογή μας (Web-poll) και αυτή τη φορά θα επικεντρωθούμε στην παραμετροποίηση του διαχειριστικού site του Django το οποίο δημιουργείται αυτόματα για εσάς. Το Django admin το συναντήσαμε πρώτα στον <a class=\"reference internal\" href=\"/el/3.0/intro/tutorial02/\"><span class=\"doc\">Οδηγό 2</span></a>.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Που να ψάξετε για βοήθεια</p>\n<p>If you’re having trouble going through this tutorial, please head over to\nthe <a class=\"reference internal\" href=\"/el/3.0/faq/help/\"><span class=\"doc\">Getting Help</span></a> section of the FAQ.</p>\n</aside>\n<section id=\"customize-the-admin-form\">\n<h2>Παραμετροποιώντας την admin form<a class=\"heading-anchor\" href=\"#customize-the-admin-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Κάνοντας register το <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> model με το Django admin (<code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code>), το Django ήταν σε θέση να κατασκευάσει μια προεπιλεγμένη εμφάνιση της φόρμας του μοντέλου για επεξεργασία. Με άλλα λόγια σας δίνει τη δυνατότητα να δημιουργείτε, επεξεργάζεστε, ανανεώνετε και διαγράφετε entries στη βάση δεδομένων σας (υπενθυμίζουμε ότι κάθε instance του μοντέλου σας αναπαριστά και μια γραμμή -entry, row- στον αντίστοιχο πίνακα της database) χωρίς τη χρήση της κονσόλας (γραμμής εντολών). Πολύ συχνά θα θέλετε να επεξεργαστείτε την εμφάνιση της φόρμας αυτής καθώς και τον τρόπο που λειτουργεί. Για να το πετύχετε αυτό δεν έχετε παρά να πείτε στο Django τις επιλογές-ρυθμίσεις που θέλετε, για αυτό το μοντέλο, την ώρα που κάνετε register το μοντέλο σας με το Django admin.</p>\n<p>Ας δούμε πως δουλεύει αναδιοργανόνοντας τα πεδία (fields) στην φόρμα επεξεργασίας (edit form). Μέσα στο αρχείο <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code>, αντικαταστήστε την γραμμή <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code> με αυτό το κομμάτι κώδικα:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;question_text&#39;</span><span class=\"p\">]</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Θα ακολουθείτε αυτή τη διαδικασία (αρχικά θα δημιουργείτε μια model admin class και έπειτα θα περνάτε αυτή τη κλάση ως δεύτερο όρισμα στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register()</span></code>) κάθε φορά που θέλετε να αλλάξετε τυχόν επιλογές στο admin (admin options) για ένα μοντέλο.</p>\n<p>Αν θυμάστε, πριν την αλλαγή αυτή, στη φόρμα επεξεργασίας εμφανιζόταν πρώτα το πεδίο της ερώτησης και μετά το πεδίο της ημερομηνίας επειδή τα είχαμε δηλώσει με αυτή τη σειρά στο μοντέλο <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. Τώρα, παρακάμπτουμε αυτή τη σειρά και πλέον εμφανίζεται πρώτα το πεδίο της ημερομηνίας («Publication date») και κατόπιν το πεδίο της ερώτησης («Question»):</p>\n<img alt=\"Fields have been reordered\" src=\"/el/3.0/_images/admin07.png\" />\n<p>Αυτό δεν είναι και τόσο εντυπωσιακό με μόλις δύο πεδία, αλλά για φόρμες admin (admin forms) με δεκάδες πεδία, η επιλογή της σειράς εμφάνισης αποτελεί σημαντική λεπτομέρεια.</p>\n<p>Και μιλώντας για φόρμες με δεκάδες πεδία, ίσως να θέλετε να διαχωρίσετε τη φόρμα σε πεδία φορμών (fieldsets):</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span>               <span class=\"p\">{</span><span class=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;question_text&#39;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;Date information&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">]}),</span>\n    <span class=\"p\">]</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Το πρώτο element από κάθε tuple μέσα στη λίστα <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">fieldsets</span></code></a> είναι ο τίτλος του fieldset. Δείτε πως θα εμφανίζεται τώρα η φόρμα:</p>\n<img alt=\"Form has fieldsets now\" src=\"/el/3.0/_images/admin08t.png\" />\n</section>\n<section id=\"adding-related-objects\">\n<h2>Προσθήκη συσχετισμένων objects<a class=\"heading-anchor\" href=\"#adding-related-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ωραία, έχουμε την σελίδα διαχείρισης του Question model, αλλά ένα <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> έχει πολλαπλά <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>s και η φόρμα δεν εμφανίζει αυτές τις επιλογές.</p>\n<p>Ακόμα.</p>\n<p>There are two ways to solve this problem. The first is to register <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>\nwith the admin just as we did with <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n<span class=\"c1\"># ...</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Choice</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Μετά από αυτό, το μοντέλο <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> απέκτησε τη δική του διαχειριστική φόρμα (admin form). Επομένως, τα πεδία της φόρμας θα εμφανιστούν με τη σειρά που δηλώθηκαν στο ίδιο το μοντέλο (εφόσον δεν κάναμε καμία αλλαγή μέσα στο <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> όπως κάναμε για το <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>). Η φόρμα θα δείχνει κάπως έτσι:</p>\n<img alt=\"Choice admin page\" src=\"/el/3.0/_images/admin09.png\" />\n<p>Σε αυτή τη φόρμα, το πεδίο «Question» αναπαριστάται από ένα HTML select box το οποίο περιέχει κάθε ερώτηση μέσα στη βάση δεδομένων. Το Django γνωρίζει ότι η κλάση <a class=\"reference internal\" href=\"/el/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> θα πρέπει να αναπαρασταθεί ως ένα <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select&gt;</span></code> box μέσα στην admin form. Στη δικιά μας περίπτωση, μόνο μια ερώτηση θα εμφανιστεί σε αυτό το σημείο (εκτός κι αν έχετε δημιουργήσει και άλλες).</p>\n<p>Επίσης προσέξτε το link «Προσθήκη Καινούγιου &lt;όνομα_μοντέλου&gt;» (με το σύμβολο της πρόσθεσης) δίπλα από το πεδίο «Question.» Κάθε object με ένα πεδίο <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> λαμβάνει αυτή την ευκολία από προεπιλογή. Όταν κλικάρετε πάνω σε αυτό το link, θα δείτε ένα popup παράθυρο με τη φόρμα επεξεργασίας του <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> μοντέλου (αυτή που είδαμε πριν). Αν προσθέσετε μια ερώτηση σε αυτό το πράθυρο και κλικάρετε «Αποθήκευση», το Django θα αποθηκεύσει την ερώτηση στη βάση δεδομένων και έπειτα θα εμφανίσει αυτή την ερώτηση ως επιλεγμένη (selected) στο <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select&gt;</span></code> box.</p>\n<p>Όμως αυτός ο τρόπος προσθήκης επιλογών (<code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> objects) δεν είναι και ο πιο αποτελεσματικός που υπάρχει. Δε θα ήταν πιο βολικό αν δημιουργούσατε τα <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Choice``s κατά τη διάρκεια δημιουργίας των ερωτήσεων; Ας το υλοποιήσουμε.</p>\n<p>Αφαιρέστε την κλήση της <code class=\"docutils literal notranslate\"><span class=\"pre\">register()</span></code> με το μοντέλο <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>. Έπειτα, επεξεργαστείτε τον registration κώδικα του <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> για να γίνει έτσι:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">StackedInline</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Choice</span>\n    <span class=\"n\">extra</span> <span class=\"o\">=</span> <span class=\"mi\">3</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span>               <span class=\"p\">{</span><span class=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;question_text&#39;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;Date information&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;fields&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">],</span> <span class=\"s1\">&#39;classes&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;collapse&#39;</span><span class=\"p\">]}),</span>\n    <span class=\"p\">]</span>\n    <span class=\"n\">inlines</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">ChoiceInline</span><span class=\"p\">]</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Αυτό λέει στο Django: «Όλα τα <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> objects θα επεξεργάζονται στην διαχειριστική σελίδα του μοντέλου <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. Από προεπιλογή, να παρέχεις 3 choices».</p>\n<p>Επισκεφτείτε, πάλι, τη σελίδα «Add question» για να δείτε πως φαίνεται:</p>\n<img alt=\"Add question page now has choices on it\" src=\"/el/3.0/_images/admin10t.png\" />\n<p>Δουλεύει κάπως έτσι: Υπάρχουν τρία slots για τα συσχετισμένα Choices – όπως δηλώθηκε μέσω του attribute <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> – και κάθε φορά που επισκέπτεστε τη σελίδα ενός ήδη υπάρχοντος object, παίρνετε άλλα τρία επιπλέον slots. Όταν όμως επισκέπτεστε για πρώτη φορά τη σελίδα (δημιουργία νέου object) θα λαμβάνετε τα πρώτα τρία slots.</p>\n<p>Στο τέλος των τριών slots θα βρείτε την επιλογή «Προσθήκη καινούργιου Choice».  Αν κλικάρετε πάνω σε αυτό, ένα νέο slot θα δημιουργηθεί. Αν θέλετε να το αφαιρέσετε κλικάρετε πάνω στο X που βρίσκεται πάνω δεξιά στο slot. Υπόψιν ότι δεν μπορείτε να αφαιρέσετε τα αρχικά τρία slots. Η παρακάτω εικόνα δείχνει ένα πρόσθετο slot (κάτω-κάτω):</p>\n<img alt=\"Additional slot added dynamically\" src=\"/el/3.0/_images/admin14t.png\" />\n<p>One small problem, though. It takes a lot of screen space to display all the\nfields for entering related <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> objects. For that reason, Django offers a\ntabular way of displaying inline related objects. To use it, change the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceInline</span></code> declaration to read:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">TabularInline</span><span class=\"p\">):</span>\n    <span class=\"c1\">#...</span>\n</code></pre></figure>\n<p>Με αυτό, <code class=\"docutils literal notranslate\"><span class=\"pre\">TabularInline</span></code> (αντί του <code class=\"docutils literal notranslate\"><span class=\"pre\">StackedInline</span></code>), τα συσχετισμένα objects εμφανίζονται πιο συμπυκνωμένα, σαν να βρίσκονται μέσα σε ένα πίνακα:</p>\n<img alt=\"Add question page now has more compact choices\" src=\"/el/3.0/_images/admin11t.png\" />\n<p>Σε αυτή τη μορφή υπάρχει και μια επιπλέον στήλη («Θέλετε να πραγματοποιηθεί διαγραφή?») η οποία σας επιτρέπει να διαγράψετε γραμμές που προστέθηκαν με την επιλογή «Προσθήκη καινούργιου Choice». Σημειώστε ότι πάντα θα έχετε το ελάχιστο τρεις επιλογές (ρύθμιση <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> μέσα στο <code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceInline</span></code>).</p>\n</section>\n<section id=\"customize-the-admin-change-list\">\n<h2>Παραμετροποιώντας την admin change list<a class=\"heading-anchor\" href=\"#customize-the-admin-change-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Τώρα που η διαχειριστική σελίδα του μοντέλου Question δείχνει όμορφη, ας κάνουμε μερικές αλλαγές στην σελίδα «change list» – αυτή που εμφανίζει όλες τις ερωτήσεις μέσα στο σύστημα (σαν μια λίστα).</p>\n<p>Δείτε πως φαίνεται σε αυτό το σημείο:</p>\n<img alt=\"Polls change list page\" src=\"/el/3.0/_images/admin04t.png\" />\n<p>Από προεπιλογή, το Django εμφανίζει τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> για κάθε object. Αλλά μερικές φορές θα ήταν πιο βολικό να εμφανίζουμε μεμονομένα πεδία. Για να το κάνουμε αυτό θα χρησιμοποιήσουμε την επιλογή-ρύθμιση <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>, η οποία είναι ένα tuple από ονόματα πεδίων (του μοντέλου σας), τα οποία θα εμφανιστούν ως στήλες σε αυτή τη σελίδα:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;question_text&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>For good measure, let’s also include the <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently()</span></code> method\nfrom <a class=\"reference internal\" href=\"/el/3.0/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;question_text&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;was_published_recently&#39;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Τώρα η σελίδα change list του Question δείχνει κάπως έτσι:</p>\n<img alt=\"Polls change list page, updated\" src=\"/el/3.0/_images/admin12t.png\" />\n<p>Μπορείτε να κλικάρετε στους headers κάθε στήλης για να ταξινομήσετε την αντίστοιχη στήλη κατά τις τιμές της. Μοναδική εξαίρεση στη δυνατότητα της ταξινόμηση μιας στήλης αποτελεί η περίπτωση του header <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code>, επειδή η ταξινόμηση με βάση την έξοδο μιας μεθόδου (ενός μοντέλου) δεν υποστηρίζεται. Επίσης, σημειώστε ότι ο header της στήλης <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code> είναι, από προεπιλογή, το όνομα της μεθόδου (με τα κενά να αντικαθιστούν τις κάτω παύλες) και κάθε κελί της στήλης αυτής περιέχει την έξοδο της συγκεκριμένης μεθόδου (True ή False).</p>\n<p>Μπορούμε να βελτιώσουμε την όλη αυτή εμφάνιση παρέχοντας μερικά attributes στην μέθοδο αυτή (μέσα στο αρχείο <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code>) ως ακολούθως:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/models.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"n\">now</span> <span class=\"o\">-</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"o\">&lt;=</span> <span class=\"n\">now</span>\n    <span class=\"n\">was_published_recently</span><span class=\"o\">.</span><span class=\"n\">admin_order_field</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;pub_date&#39;</span>\n    <span class=\"n\">was_published_recently</span><span class=\"o\">.</span><span class=\"n\">boolean</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"n\">was_published_recently</span><span class=\"o\">.</span><span class=\"n\">short_description</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Published recently?&#39;</span>\n</code></pre></figure>\n<p>Για περισσότερες πληροφορίες σχετικά με τα properties των μεθόδων, δείτε στο <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>.</p>\n<p>Επεξεργαστείτε το αρχείο <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code> για ακόμη μια φορά και προσθέστε ένα φίλτρο στη σελίδα change list του μοντέλου <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> χρησιμοποιώντας το <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_filter</span></code></a>. Προσθέστε την ακόλουθη γραμμή κώδικα στην κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">QuestionAdmin</span></code>:</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=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Αυτό προσθέτει μια πλευρική στήλη (sidebar) «Filter» η οποία επιτρέπει το φιλτράρισμα των αποτελεσμάτων στην σελίδα change list κατά το πεδίο <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code>:</p>\n<img alt=\"Polls change list page, updated\" src=\"/el/3.0/_images/admin13t.png\" />\n<p>Ο τύπος του φίλτρου που εμφανίζεται εξαρτάται από τον τύπο του πεδίου που προσπαθείτε να φιλτράρετε. Επειδή το πεδίο <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> είναι τύπου <a class=\"reference internal\" href=\"/el/3.0/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a>, το Django ξέρει ότι πρέπει να του δώσει τις ανάλογες επιλογές για φιλτράρισμα, όπως: «Οποιαδήποτε ημερομηνία», «Σήμερα», «Τελευταίες 7 μέρες», «Αυτόν το μήνα», «Αυτόν το χρόνο».</p>\n<p>Αρχίζει και παίρνει σχήμα η όλη σελίδα μας. Ας προσθέσουμε τη δυνατότητα του searching:</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=\"n\">search_fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;question_text&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Αυτό προσθέτει ένα search box κοντά στην κορυφή της σελίδας change list. Όταν κάποιος πληκτρολογήσει κάποια λέξη κλειδί για εύρεση, το Django θα ψάξει μέσα στο πεδίο <code class=\"docutils literal notranslate\"><span class=\"pre\">question_text</span></code>. Μπορείτε να χρησιμοποιήσετε όσα πεδία θέλετε – όμως επειδή η μέθοδος αυτή κάνει χρήση του <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> query στο παρασκήνιο, αν περιορίσετε τον αριθμό των search fields μέσα στο πεδίο <code class=\"docutils literal notranslate\"><span class=\"pre\">search_fields</span></code>, τότε θα κάνει τη δουλειά της database σας πιο εύκολη στην εύρεση της λέξης κλειδί που δώσατε.</p>\n<p>Τώρα είναι μια καλή στιγμή να σημειώσουμε ότι η σελίδες change lists σας δίνουν δωρεάν τη δυνατότητα του pagination. Από προεπιλογή, το Djoango εμφανίζει 100 γραμμές ανά σελίδα. Τα attributes <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_per_page\" title=\"django.contrib.admin.ModelAdmin.list_per_page\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Change</span> <span class=\"pre\">list</span> <span class=\"pre\">pagination</span></code></a>, <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">search</span> <span class=\"pre\">boxes</span></code></a>, <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">filters</span></code></a>, <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy\" title=\"django.contrib.admin.ModelAdmin.date_hierarchy\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">date-hierarchies</span></code></a> και\n<a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">column-header-ordering</span></code></a> συνεργάζονται μεταξύ τους όπως ακριβώς νομίζετε.</p>\n</section>\n<section id=\"customize-the-admin-look-and-feel\">\n<h2>Παραμετροποιώντας την εμφάνιση του admin site<a class=\"heading-anchor\" href=\"#customize-the-admin-look-and-feel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Βασικά, η λέξη «Διαχείριση Django» στην κορυφή κάθε σελίδας του admin είναι γελοία. Στην πραγματικότητα είναι ένα κείμενο placeholder.</p>\n<p>You can change it, though, using Django’s template system. The Django admin is\npowered by Django itself, and its interfaces use Django’s own template system.</p>\n<section id=\"customizing-your-project-s-templates\">\n<span id=\"ref-customizing-your-projects-templates\"></span><h3>Παραμετροποιώντας τα templates του <em>project</em> σας<a class=\"heading-anchor\" href=\"#customizing-your-project-s-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Δημιουργήστε έναν φάκελο <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> μέσα στο root φάκελο του project σας (αυτόν που περιέχει το αρχείο <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>). Τα templates μπορούν να υπάρχουν οπουδήποτε μέσα στο filesystem σας αρκεί το Django να έχει πρόσβαση σε αυτά. (Το Django τρέχει υπό τον χρήστη που τρέχει και τον server σας.) Ωστόσο, το να κρατάτε τα templates σας μέσα στο project σας είναι μια, γενικά, καλή πρακτική.</p>\n<p>Ανοίξτε το αρχείο ρυθμίσεων-επιλογών του project σας (settings file, <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code>) και προσθέστε την επιλογή <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> μέσα στην επιλογή <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/settings.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.template.backends.django.DjangoTemplates&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;DIRS&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">BASE_DIR</span><span class=\"p\">,</span> <span class=\"s1\">&#39;templates&#39;</span><span class=\"p\">)],</span>\n        <span class=\"s1\">&#39;APP_DIRS&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;context_processors&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n                <span class=\"s1\">&#39;django.template.context_processors.debug&#39;</span><span class=\"p\">,</span>\n                <span class=\"s1\">&#39;django.template.context_processors.request&#39;</span><span class=\"p\">,</span>\n                <span class=\"s1\">&#39;django.contrib.auth.context_processors.auth&#39;</span><span class=\"p\">,</span>\n                <span class=\"s1\">&#39;django.contrib.messages.context_processors.messages&#39;</span><span class=\"p\">,</span>\n            <span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Η επιλογή <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> είναι μια λίστα με strings. Κάθε string είναι η διαδρομή (path) η οποία καταλήγει σε κάποιο φάκελο που περιέχει τα templates σας. Όταν το Django φορτώνει τα templates θα ψάξει και σε αυτά τα paths για να βρει τα templates σας. Με άλλα λόγια αποτελεί ένα μονοπάτι ευρέσεως των templates.</p>\n<aside class=\"admonition-organizing-templates admonition\">\n<p class=\"admonition-title\">Οργανώνοντας τα templates</p>\n<p>Just like the static files, we <em>could</em> have all our templates together, in\none big templates directory, and it would work perfectly well. However,\ntemplates that belong to a particular application should be placed in that\napplication’s template directory (e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code>) rather than the\nproject’s (<code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code>). We’ll discuss in more detail in the\n<a class=\"reference internal\" href=\"/el/3.0/intro/reusable-apps/\"><span class=\"doc\">reusable apps tutorial</span></a> <em>why</em> we do this.</p>\n</aside>\n<p>Δημιουργήστε, τώρα, ένα φάκελο με όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> μέσα στο φάκελο <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> και κάντε αντιγραφή-επικόλληση το αρχείο template <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> το οποίο θα βρείτε μέσα στον πηγαίο κώδικα του Django (<code class=\"docutils literal notranslate\"><span class=\"pre\">django/contrib/admin/templates</span></code>).</p>\n<aside class=\"admonition-where-are-the-django-source-files admonition\">\n<p class=\"admonition-title\">Που είναι ο πηγαίος κώδικας του Django?</p>\n<p>Αν δυσκολεύεστε να βρείτε τον πηγαίο κώδικα του Django μέσα στο σύστημα σας, τρέξτε την ακόλουθη εντολή:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-c<span class=\"w\"> </span><span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -c <span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div></div></div>\n</aside>\n<p>Then, edit the file and replace\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site_header|default:_('Django</span> <span class=\"pre\">administration')</span> <span class=\"pre\">}}</span></code> (including the curly\nbraces) with your own site’s name as you see fit. You should end up with\na section of code like:</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\">block</span> <span class=\"nv\">branding</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;site-name&quot;</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;admin:index&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Polls Administration<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Χρησιμοποιούμε αυτή τη διαδικασία για να σας δείξουμε πως μπορείτε να κάνετε override τα templates. Σε ένα πραγματικό project, το πιο πιθανόν είναι να χρησιμοποιήσετε το attibute <a class=\"reference internal\" href=\"/el/3.0/ref/contrib/admin/#django.contrib.admin.AdminSite.site_header\" title=\"django.contrib.admin.AdminSite.site_header\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.AdminSite.site_header</span></code></a> κάνοντας την παραπάνω διαδικασία ακόμα πιο εύκολη.</p>\n<p>Αυτό το αρχείο template περιέχει αρκετό κείμενο όπως <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">branding</span> <span class=\"pre\">%}</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">title</span> <span class=\"pre\">}}</span></code>. Τα tags <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span></code> είναι μέρος της γλώσσας template του Django. Όταν το Django κάνει render το αρχείο <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code>, αυτή η γλώσσα θα τρέξει και θα γεμίσει αυτά τα tags με διάφορες τιμές για να παραχθεί στο τέλος η HTML σελίδα που θα επιστρέψει πίσω στον χρήστη (ως response), όπως είδαμε στον <a class=\"reference internal\" href=\"/el/3.0/intro/tutorial03/\"><span class=\"doc\">Οδηγό 3</span></a>.</p>\n<p>Note that any of Django’s default admin templates can be overridden. To\noverride a template, do the same thing you did with <code class=\"docutils literal notranslate\"><span class=\"pre\">base_site.html</span></code> – copy\nit from the default directory into your custom directory, and make changes.</p>\n</section>\n<section id=\"customizing-your-application-s-templates\">\n<h3>Παραμετροποιώντας τα templates της <em>εφαρμογής</em> σας<a class=\"heading-anchor\" href=\"#customizing-your-application-s-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Οι προσεκτικοί αναγνώστες θα αναρρωτηθούν: Αφού η ρύθμιση (λίστα) <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> είναι κενή αρχικά, πως ξέρει το Django που να βρει τα προεπιλεγμένα admin templates; Η απάντηση έχει ως εξής: εφόσον η ρύθμιση (boolean) <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> έχει την τιμή <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, το Django αυτόματα κοιτάζει στο φάκελο <code class=\"docutils literal notranslate\"><span class=\"pre\">templates/</span></code> κάθε εφαρμογής (που συμπεριλαμβάνεται στη ρύθμιση-λίστα <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>), για τη χρήση τους ως fallback (μην ξεχνάτε ότι το <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code> είναι και αυτό μια εφαρμογή).</p>\n<p>Η εφαρμογή ψηφοφορίας μας δεν είναι πολύ περίπλοκη και δεν χρειάζεται κάποια μεγάλη παραμετροποίηση των admin templates. Αλλά αν αναπτυχθεί και μεγαλώσει σε τέτοιο βαθμό που να χρειάζεται απαραιτήτως διάφορες λειτουργικές επεμβάσεις στα default templates του Django, τότε θα ήταν πιο λογικό να γίνει σε επίπεδο <em>application</em> (μέσα στο φάκελο templates της εφαρμογής σας) παρά σε επίπεδο <em>project</em> (μέσα στο φάκελο templates του project σας). Με αυτό τον τρόπο, θα μπορέσετε να συμπεριλάβετε την εφαρμογή ψηφοφορίας σας σε κάποιο μελλοντικό project και θα είστε σίγουροι ότι τα templates αυτής της εφαρμογής θα εφαρμοστούν αμέσως στο νέο project.</p>\n<p>Δείτε στο <a class=\"reference internal\" href=\"/el/3.0/topics/templates/#template-loading\"><span class=\"std std-ref\">εγχειρίδιο (documentation) φόρτωσης των templates</span></a> για περισσότερες πληροφορίες σχετικά με το πως το Django βρίσκει-αναζητά τα templates.</p>\n</section>\n</section>\n<section id=\"customize-the-admin-index-page\">\n<h2>Παραμετροποιώντας την αρχική σελίδα του Django admin<a class=\"heading-anchor\" href=\"#customize-the-admin-index-page\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ομοίως, ίσως να θέλετε να παραμετροποιήσετε (να φέρετε στα μέτρα σας) την εμφάνιση της αρχικής σελίδας του Django admin.</p>\n<p>Από προεπιλογή, εμφανίζονται όλες οι εφαρμογές (κατά αλφαβητική σειρά) που συμπεριλαμβάνονται στη ρύθμιση (λίστα) <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> και έχουν γίνει register με το admin. Αν θέλετε να κάνετε σημαντικές αλλαγές στην εμφάνιση της αρχικής σελίδας δεν έχετε παρά να βάλετε τη φαντασία σας να δουλέψει. Είναι γνωστό ότι η εμφάνιση της αρχικής σελίδας του admin είναι η πιο σημαντική και θα πρέπει να είναι εύκολο να την παραμετροποιήσετε.</p>\n<p>To template προς παραμετροποίηση είναι το <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/index.html</span></code> (κάντε το ίδιο όπως κάνατε για το αρχείο <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> πριν – αντιγράψτε το από τον πηγαίο κώδικα του Django στον τοπικό φάκελο templates της εφαρμογής σας). Κατά τη διάρκεια επεξεργασίας του αρχείου θα δείτε ότι χρησιμοποιείται μια template variable με το όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">app_list</span></code>. Αυτή η μεταβλητή περιέχει κάθε εγκατεστημένη εφαρμογή στο Django (είναι μέσα στο <a class=\"reference internal\" href=\"/el/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> και register στο admin). Αντί αυτού, μπορείτε να γράψετε hard-code συνδέσμους σε object-specific admin σελίδες με όποιον τρόπο πιστεύετε ότι είναι καλύτερος.</p>\n</section>\n<section id=\"what-s-next\">\n<h2>Επόμενα βήματα<a class=\"heading-anchor\" href=\"#what-s-next\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ο οδηγός για αρχάριους τελειώνει κάπου εδώ. Στο μεταξύ μπορείτε να δείτε προτεινόμενες κατευθύνσεις για το τι να κάνετε έπειτα, στο άρθρο <a class=\"reference internal\" href=\"/el/3.0/intro/whatsnext/\"><span class=\"doc\">τι να κάνω μετά από εδώ</span></a>.</p>\n<p>Αν είστε εξοικειωμένοι με το Python packaging και ενδιαφέρεστε να μάθετε πως να μετατρέψετε την εφαρμογή ψηφοφορίας σε «επαναχρησιμοποιήσιμη εφαρμογή», δείτε το άρθρο <a class=\"reference internal\" href=\"/el/3.0/intro/reusable-apps/\"><span class=\"doc\">Οδηγός για προχωρημένους: Πως να γράψετε επαναχρησιμοποιήσιμα apps</span></a>.</p>\n</section>","rootId":"writing-your-first-django-app-part-7","toc":[{"title":"Παραμετροποιώντας την admin form","anchor":"customize-the-admin-form","children":[]},{"title":"Προσθήκη συσχετισμένων objects","anchor":"adding-related-objects","children":[]},{"title":"Παραμετροποιώντας την admin change list","anchor":"customize-the-admin-change-list","children":[]},{"title":"Παραμετροποιώντας την εμφάνιση του admin site","anchor":"customize-the-admin-look-and-feel","children":[{"title":"Παραμετροποιώντας τα templates του project σας","anchor":"customizing-your-project-s-templates","children":[]},{"title":"Παραμετροποιώντας τα templates της εφαρμογής σας","anchor":"customizing-your-application-s-templates","children":[]}]},{"title":"Παραμετροποιώντας την αρχική σελίδα του Django admin","anchor":"customize-the-admin-index-page","children":[]},{"title":"Επόμενα βήματα","anchor":"what-s-next","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Ξεκινώντας","url":"/el/3.0/intro/"}],"prev":{"docname":"intro/tutorial06","title":"Γράφοντας το πρώτο σας Django app, μέρος 6","url":"/el/3.0/intro/tutorial06/"},"next":{"docname":"intro/reusable-apps","title":"Οδηγός για προχωρημένους: Πως να γράψετε επαναχρησιμοποιήσιμα apps","url":"/el/3.0/intro/reusable-apps/"},"formats":{"html":"/el/3.0/intro/tutorial07/","markdown":"/el/3.0/intro/tutorial07.md","json":"/el/3.0/intro/tutorial07.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/intro/tutorial07.txt","official":"https://docs.djangoproject.com/el/3.0/intro/tutorial07/","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"]}