{"title":"Γράφοντας δικές σας django-admin εντολές","version":"1.11","locale":"el","docname":"howto/custom-management-commands","url":"/el/1.11/howto/custom-management-commands/","canonical":"https://djangodocs.dev/el/1.11/howto/custom-management-commands/","summary":"Οι εφαρμογές μπορούν να κάνουν register τις δικές τους ενέργειες με το manage.py . Για παράδειγμα, ίσως να θέλετε να προσθέσετε μια manage.py ενέργεια για ένα…","html":"<span id=\"writing-custom-django-admin-commands\"></span><h1>Γράφοντας δικές σας <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span></code> εντολές<a class=\"heading-anchor\" href=\"#module-django.core.management\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Οι εφαρμογές μπορούν να κάνουν register τις δικές τους ενέργειες με το <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>. Για παράδειγμα, ίσως να θέλετε να προσθέσετε μια <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> ενέργεια για ένα Django app το οποίο προωθείτε για διανομή. Σε αυτό το άρθρο θα χτίσουμε μια δικιά μας εντολή, με το όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">closepoll</span></code>, για την εφαρμογή <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> που φτιάξαμε στον <a class=\"reference internal\" href=\"/el/1.11/intro/tutorial01/\"><span class=\"doc\">οδηγό</span></a>.</p>\n<p>Για να το κάνουμε αυτό, απλά δημιουργήστε μια δομή φακέλων μέσα στην εφαρμογή ως εξής: <code class=\"docutils literal notranslate\"><span class=\"pre\">management/commands</span></code>. Το Django θα κάνει register μια <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> εντολή για κάθε Python module μέσα σε αυτό το φάκελο του οποίου το όνομα δεν ξεκινά με τον χαρακτήρα της κάτω παύλας. Για παράδειγμα:</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\">polls</span><span class=\"o\">/</span>\n    <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">management</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">commands</span><span class=\"o\">/</span>\n            <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n            <span class=\"n\">_private</span><span class=\"o\">.</span><span class=\"n\">py</span>\n            <span class=\"n\">closepoll</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">py</span>\n</code></pre></div>\n<p>Αν χρησιμοποιείτε την Python 2, σιγουρευτείτε ότι το αρχείο <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> (κενό αρχείο) υπάρχει και στους δύο φακέλους (<code class=\"docutils literal notranslate\"><span class=\"pre\">management</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">management/commands</span></code>) όπως φαίνεται παραπάνω αλλιώς η εντολή σας δεν θα μπορέσει να εντοπιστεί.</p>\n<p>Σε αυτό το παράδειγμα, η εντολή <code class=\"docutils literal notranslate\"><span class=\"pre\">closepoll</span></code> θα είναι διαθέσιμη σε κάθε project που έχει εγκατεστημένη αυτή την εφαρμογή, ήτοι, η εφαρμογή <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> βρίσκεται μέσα στη ρύθμιση <a class=\"reference internal\" href=\"/el/1.11/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n<p>Το module <code class=\"docutils literal notranslate\"><span class=\"pre\">_private.py</span></code> δεν θα είναι διαθέσιμο ως μια εντολή διαχείρισης (management command), αφού το όνομα του ξεκινά με την κάτω παύλα.</p>\n<p>Το module <code class=\"docutils literal notranslate\"><span class=\"pre\">closepoll.py</span></code> έχει μόνο μια απαίτηση – πρέπει να ορίσει μια κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">Command</span></code> η οποία κάνει extend την κλάση <a class=\"reference internal\" href=\"#django.core.management.BaseCommand\" title=\"django.core.management.BaseCommand\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code></a> ή μια από τις <a class=\"reference internal\" href=\"#ref-basecommand-subclasses\"><span class=\"std std-ref\">subclasses</span></a> της.</p>\n<aside class=\"admonition-standalone-scripts admonition\">\n<p class=\"admonition-title\">Αυτόνομα scripts</p>\n<p>Οι παραμετροποιήσιμες εντολές διαχείρισης είναι εξαιρετικά χρήσιμες για την εκτέλεση αυτόνομων scripts ή για scripts τα οποία εκτελούνται σε περιοδική βάση από το crontab του UNIX ή από τα scheduled tasks των Windows.</p>\n</aside>\n<p>Για να υλοποιήσετε την εντολή επεξεργαστείτε το αρχείο <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/management/commands/closepoll.py</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.management.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseCommand</span><span class=\"p\">,</span> <span class=\"n\">CommandError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">polls.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span> <span class=\"k\">as</span> <span class=\"n\">Poll</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">BaseCommand</span><span class=\"p\">):</span>\n    <span class=\"n\">help</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Closes the specified poll for voting&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">add_arguments</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">parser</span><span class=\"p\">):</span>\n        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_argument</span><span class=\"p\">(</span><span class=\"s1\">&#39;poll_id&#39;</span><span class=\"p\">,</span> <span class=\"n\">nargs</span><span class=\"o\">=</span><span class=\"s1\">&#39;+&#39;</span><span class=\"p\">,</span> <span class=\"nb\">type</span><span class=\"o\">=</span><span class=\"nb\">int</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">):</span>\n        <span class=\"k\">for</span> <span class=\"n\">poll_id</span> <span class=\"ow\">in</span> <span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;poll_id&#39;</span><span class=\"p\">]:</span>\n            <span class=\"k\">try</span><span class=\"p\">:</span>\n                <span class=\"n\">poll</span> <span class=\"o\">=</span> <span class=\"n\">Poll</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">poll_id</span><span class=\"p\">)</span>\n            <span class=\"k\">except</span> <span class=\"n\">Poll</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n                <span class=\"k\">raise</span> <span class=\"n\">CommandError</span><span class=\"p\">(</span><span class=\"s1\">&#39;Poll &quot;</span><span class=\"si\">%s</span><span class=\"s1\">&quot; does not exist&#39;</span> <span class=\"o\">%</span> <span class=\"n\">poll_id</span><span class=\"p\">)</span>\n\n            <span class=\"n\">poll</span><span class=\"o\">.</span><span class=\"n\">opened</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n            <span class=\"n\">poll</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stdout</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">style</span><span class=\"o\">.</span><span class=\"n\">SUCCESS</span><span class=\"p\">(</span><span class=\"s1\">&#39;Successfully closed poll &quot;</span><span class=\"si\">%s</span><span class=\"s1\">&quot;&#39;</span> <span class=\"o\">%</span> <span class=\"n\">poll_id</span><span class=\"p\">))</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" id=\"management-commands-output\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Όταν χρησιμοποιείτε εντολές διαχείρισης και θέλετε να εμφανίσετε κάτι στην κονσόλα, θα πρέπει να το στέλνετε στο <code class=\"docutils literal notranslate\"><span class=\"pre\">self.stdout</span></code> και στο <code class=\"docutils literal notranslate\"><span class=\"pre\">self.stderr</span></code>, αντί να το εκτυπώνετε απ’ ευθείας στο <code class=\"docutils literal notranslate\"><span class=\"pre\">stdout</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">stderr</span></code>. Χρησιμοποιώντας αυτά, το τεστ της εντολής σας γίνεται παιχνιδάκι. Σημειώστε, επίσης, ότι δεν χρειάζεται να προσθέτετε το χαρακτήρα της νέας γραμμής (line feed) στο τέλος κάθε <code class=\"docutils literal notranslate\"><span class=\"pre\">self.stdout</span></code> ή <code class=\"docutils literal notranslate\"><span class=\"pre\">self.stderr</span></code> του μηνύματος σας. Θα προστεθεί αυτόματα από το Django εκτός και αν θέλετε διαφορετικά χρησιμοποιώντας την παράμετρο <code class=\"docutils literal notranslate\"><span class=\"pre\">ending</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=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stdout</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"s2\">&quot;Unterminated line&quot;</span><span class=\"p\">,</span> <span class=\"n\">ending</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<p>Την καινούργια σας εντολή μπορείτε να την καλείτε ως <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">closepoll</span> <span class=\"pre\">&lt;poll_id&gt;</span></code>. Αν θέλετε να δείτε όλες τις διαθέσιμες εντολές, όλων των ενεργοποιημένων apps του project σας, πληκτρολογήστε <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span></code> και εκεί θα δείτε και τη δική σας κάτω από την εφαρμογή <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>.</p>\n<p>Η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">handle()</span></code> λαμβάνει ένα ή περισσότερα <code class=\"docutils literal notranslate\"><span class=\"pre\">poll_ids</span></code> (το <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;poll_id&gt;</span></code> μέσα στο <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">closepoll</span> <span class=\"pre\">&lt;poll_id&gt;</span></code>, που αν θέλουμε να προσθέσουμε πολλά τα διαχωρίζουμε με κενό) και θέτει το attribute <code class=\"docutils literal notranslate\"><span class=\"pre\">poll.opened</span></code> σε <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> για κάθε ένα poll. Αν ο χρήστης έχει πληκτρολογήσει κάποιο ή κάποια polls που δεν υπάρχουν, το σφάλμα <a class=\"reference internal\" href=\"#django.core.management.CommandError\" title=\"django.core.management.CommandError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">CommandError</span></code></a> γίνεται raised. Το attribute <code class=\"docutils literal notranslate\"><span class=\"pre\">poll.opened</span></code> δεν υπάρχει στον <a class=\"reference internal\" href=\"/el/1.11/intro/tutorial01/\"><span class=\"doc\">οδηγό</span></a> και προστέθηκε στο μοντέλο <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.models.Question</span></code> για το συγκεκριμένο παράδειγμα. Δεν έχετε παρά να το προσθέσετε και εσείς, όμως μην ξεχάσετε να τρέξετε τις εντολές <code class=\"docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> για να προστεθεί η αντίστοιχη στήλη στη βάση δεδομένων σας.</p>\n<section id=\"accepting-optional-arguments\">\n<span id=\"custom-commands-options\"></span><h2>Προαιρετικά arguments<a class=\"heading-anchor\" href=\"#accepting-optional-arguments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Αλλάζοντας εύκολα την εντολή <code class=\"docutils literal notranslate\"><span class=\"pre\">closepoll</span></code> ώστε να δέχεται επιπρόσθετες επιλογές όταν την καλείτε, θα μπορούσε να διαγράφει ένα poll αντί να το θέτει ως κλειστό (<code class=\"docutils literal notranslate\"><span class=\"pre\">poll.opened</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code>). Αυτές οι επιλογές μπορούν να προστεθούν στη μέθοδο <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.add_arguments\" title=\"django.core.management.BaseCommand.add_arguments\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add_arguments()</span></code></a> ως εξής:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">BaseCommand</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">add_arguments</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">parser</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Positional arguments</span>\n        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_argument</span><span class=\"p\">(</span><span class=\"s1\">&#39;poll_id&#39;</span><span class=\"p\">,</span> <span class=\"n\">nargs</span><span class=\"o\">=</span><span class=\"s1\">&#39;+&#39;</span><span class=\"p\">,</span> <span class=\"nb\">type</span><span class=\"o\">=</span><span class=\"nb\">int</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Named (optional) arguments</span>\n        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_argument</span><span class=\"p\">(</span>\n            <span class=\"s1\">&#39;--delete&#39;</span><span class=\"p\">,</span>\n            <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s1\">&#39;store_true&#39;</span><span class=\"p\">,</span>\n            <span class=\"n\">dest</span><span class=\"o\">=</span><span class=\"s1\">&#39;delete&#39;</span><span class=\"p\">,</span>\n            <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n            <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s1\">&#39;Delete poll instead of closing it&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">if</span> <span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;delete&#39;</span><span class=\"p\">]:</span>\n            <span class=\"n\">poll</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n        <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>Η επιλογή (η <code class=\"docutils literal notranslate\"><span class=\"pre\">delete</span></code> στο παράδειγμα μας) είναι διαθέσιμη μέσα στη μέθοδο handle μέσα από το options dictionary με το key delete. Δείτε περισσότερα στο εγχειρίδιο της Python σχετικά με τη χρήση της <a class=\"reference external\" href=\"https://docs.python.org/3/library/argparse.html#module-argparse\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">argparse</span></code></a> και τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">add_argument</span></code> .</p>\n<p>Πέρα από τη δυνατότητα της πρόσθεσης δικών σας επιλογών στην εντολή, όλες οι <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/\"><span class=\"doc\">εντολές διαχείρισης</span></a> μπορούν να δεχτούν μερικές δικές τους, προεγκατεστημένες, επιλογές όπως η <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/#cmdoption-verbosity\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--verbosity</span></code></a> και η <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/#cmdoption-traceback\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--traceback</span></code></a>.</p>\n</section>\n<section id=\"management-commands-and-locales\">\n<span id=\"id1\"></span><h2>Εντολές διαχείρισης και locales<a class=\"heading-anchor\" href=\"#management-commands-and-locales\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Από προεπιλογή, η μέθοδος <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.execute\" title=\"django.core.management.BaseCommand.execute\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">BaseCommand.execute()</span></code></a> απενεργοποιεί τις μεταφράσεις (που τυχόν έχουν γίνει) επειδή κάποιες εντολές διαχείρισης του Django εκτελούν διάφορες εργασίες (πχ population της database, rendering των δεδομένων που βλέπει ο χρήστης) οι οποίες απαιτούν μια γλώσσα που να είναι καθολική και να μην εξαρτάται από το εκάστοτε project του προγραμματιστή.</p>\n<p>Αν, για κάποιο λόγο, η δική σας εντολή διαχείρισης χρειάζεται να χρησιμοποιήσει ένα μόνιμο locale, θα χρειαστεί να το ενεργοποιήσετε/απενεργοποιήσετε χειροκίνητα μέσα στη μέθοδο <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.handle\" title=\"django.core.management.BaseCommand.handle\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">handle()</span></code></a> χρησιμοποιώντας τις μεθόδους που παρέχονται από το module I18N:</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.core.management.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseCommand</span><span class=\"p\">,</span> <span class=\"n\">CommandError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">translation</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">BaseCommand</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">):</span>\n\n        <span class=\"c1\"># Activate a fixed locale, e.g. Russian</span>\n        <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s1\">&#39;ru&#39;</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Or you can activate the LANGUAGE_CODE # chosen in the settings:</span>\n        <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n        <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">LANGUAGE_CODE</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Your command logic here</span>\n        <span class=\"o\">...</span>\n\n        <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">deactivate</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Μια άλλη προσέγγιση ίσως, είναι να χρησιμοποιήσετε το locale που έχετε θέσει στα settings του project σας και το Django να μην το απενεργοποιήσει. Το επιτυγχάνετε αυτό χρησιμοποιώντας την επιλογή <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.leave_locale_alone\" title=\"django.core.management.BaseCommand.leave_locale_alone\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">BaseCommand.leave_locale_alone</span></code></a>.</p>\n<p>Όταν δουλεύετε σε σενάρια παρόμοια με τα παραπάνω, λάβετε υπόψη σας ότι οι εντολές διαχείρισης του συστήματος πρέπει να είναι πολύ προσεκτικές όταν τρέχουν σε μη ομοιόμορφα locales, που σημαίνει ότι θα χρειαστεί να:</p>\n<ul class=\"simple\">\n<li><p>Σιγουρευτείτε ότι η ρύθμιση <a class=\"reference internal\" href=\"/el/1.11/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span></code></a> είναι πάντα <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> όταν τρέχετε την εντολή (αυτό είναι ένα καλό παράδειγμα των πιθανών προβλημάτων που απορρέουν από ένα δυναμικό runtime περιβάλλον, όπου οι Django εντολές διαχείρισης προσπαθούν να αποφύγουν απενεργοποιώντας τις μεταφράσεις).</p></li>\n<li><p>Ελέγξτε τον κώδικα της εντολής σας καθώς και τυχόν κώδικα που καλεί η εντολή σας για να δείτε τυχόν διαφορές συμπεριφοράς όταν τα locales αλλάζουν και να αξιοποιήσετε την επιρροή του κώδικα πάνω στην προβλέψιμη συμπεριφορά της εντολής σας.</p></li>\n</ul>\n</section>\n<section id=\"testing\">\n<h2>Τεστ<a class=\"heading-anchor\" href=\"#testing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Πληροφορίες στο πως να τεστάρετε τις δικές σας εντολές διαχείρισης, μπορείτε να βρείτε στα <a class=\"reference internal\" href=\"/el/1.11/topics/testing/tools/#topics-testing-management-commands\"><span class=\"std std-ref\">εργαλεία για τεστ</span></a>.</p>\n</section>\n<section id=\"overriding-commands\">\n<h2>Overriding commands<a class=\"heading-anchor\" href=\"#overriding-commands\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django registers the built-in commands and then searches for commands in\n<a class=\"reference internal\" href=\"/el/1.11/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> in reverse. During the search, if a command name\nduplicates an already registered command, the newly discovered command\noverrides the first.</p>\n<p>In other words, to override a command, the new command must have the same name\nand its app must be before the overridden command’s app in\n<a class=\"reference internal\" href=\"/el/1.11/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n<p>Management commands from third-party apps that have been unintentionally\noverridden can be made available under a new name by creating a new command in\none of your project’s apps (ordered before the third-party app in\n<a class=\"reference internal\" href=\"/el/1.11/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>) which imports the <code class=\"docutils literal notranslate\"><span class=\"pre\">Command</span></code> of the overridden\ncommand.</p>\n</section>\n<section id=\"command-objects\">\n<h2>Objects εντολών<a class=\"heading-anchor\" href=\"#command-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">BaseCommand</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Η κύρια κλάση από την οποία πηγάζουν όλες οι εντολές διαχείρισης.</p>\n<p>Χρησιμοποιήστε αυτή την κλάση αν θέλετε να έχετε πρόσβαση σε όλους τους μηχανισμούς οι οποίοι μεταφράζουν τις επιλογές στη γραμμή εντολών (όπως την <code class=\"docutils literal notranslate\"><span class=\"pre\">--delete</span></code> που χρησιμοποιήσαμε νωρίτερα) και αποφασίζουν, ανάλογα την επιλογή, ποιον κώδικα να καλέσουν περαιτέρω. Αν δεν θέλετε να αλλάξετε κάποια από αυτές τις συμπεριφορές, ίσως σας φανεί χρήσιμη μια από τις <a class=\"reference internal\" href=\"#ref-basecommand-subclasses\"><span class=\"std std-ref\">subclasses</span></a> της <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code>.</p>\n<p>Πραγματοποιώντας subclassing στην κλάση <a class=\"reference internal\" href=\"#django.core.management.BaseCommand\" title=\"django.core.management.BaseCommand\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code></a> απαιτεί να υλοποιήσετε τη μέθοδο <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.handle\" title=\"django.core.management.BaseCommand.handle\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">handle()</span></code></a>.</p>\n<section id=\"attributes\">\n<h3>Attributes<a class=\"heading-anchor\" href=\"#attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Όλα τα attributes μπορούν να οριστούν στη δική σας κλάση και να χρησιμοποιηθούν στις <a class=\"reference internal\" href=\"#ref-basecommand-subclasses\"><span class=\"std std-ref\">subclasses</span></a> της <a class=\"reference internal\" href=\"#django.core.management.BaseCommand\" title=\"django.core.management.BaseCommand\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code></a>.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.help\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">help</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.help\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Μια μικρή περιγραφή της εντολής η οποία θα εκτυπωθεί στην κονσόλα όταν ο χρήστης τρέξει την εντολή <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">help</span> <span class=\"pre\">&lt;command&gt;</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.missing_args_message\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">missing_args_message</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.missing_args_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Αν η εντολή σας ορίζει κάποια υποχρεωτικά positional arguments, μπορείτε να παραμετροποιήσετε το μήνυμα σφάλματος που επιστρέφεται, σε περίπτωση που αυτά τα arguments λείπουν. Προεπιλεγμένη τιμή είναι η έξοδος της <a class=\"reference external\" href=\"https://docs.python.org/3/library/argparse.html#module-argparse\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">argparse</span></code></a> («too few arguments»).</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.output_transaction\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">output_transaction</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.output_transaction\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Τύπου boolean που υποδεικνύει αν η εντολή θα εκτυπώσει (στην κονσόλα) εντολές SQL. Αν είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, τότε η έξοδος θα συμπεριληφθεί μέσα σε ένα <code class=\"docutils literal notranslate\"><span class=\"pre\">BEGIN;</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">COMMIT;</span></code>. Προεπιλεγμένη τιμή είναι το <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.requires_migrations_checks\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">requires_migrations_checks</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.requires_migrations_checks\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"1.10\">\n<p class=\"version-note-title\">New in Django 1.10</p></aside>\n<p>Τύπου boolean. Αν είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, η εντολή θα εκτυπώσει ένα warning αν το σετ των migrations στο δίσκο δεν ταιριάζει με τα migrations στη βάση δεδομένων. Υπόψιν ότι, ένα warning δεν εμποδίζει την εντολή από το να εκτελεστεί. Προεπιλεγμένη τιμή είναι το <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.requires_system_checks\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">requires_system_checks</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.requires_system_checks\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Τύπου boolean. Αν είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, τότε ολόκληρο το Django project σας θα ελεγχθεί για τυχόν σφάλματα πριν εκτελεστεί η εντολή. Προεπιλεγμένη τιμή είναι το <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.leave_locale_alone\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">leave_locale_alone</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.leave_locale_alone\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A boolean indicating whether the locale set in settings should be preserved\nduring the execution of the command instead of translations being\ndeactivated.</p>\n<p>Προεπιλεγμένη τιμή είναι το <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p>Make sure you know what you are doing if you decide to change the value of\nthis option in your custom command if it creates database content that\nis locale-sensitive and such content shouldn’t contain any translations\n(like it happens e.g. with <a class=\"reference internal\" href=\"/el/1.11/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a> permissions) as\nactivating any locale might cause unintended effects. See the <a class=\"reference internal\" href=\"#id1\">Management\ncommands and locales</a> section above for further details.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.style\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">style</span></span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.style\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ένα attribute που βοηθά στο να χρωματίσει την έξοδο (δηλαδή το κείμενο) όταν γράφετε στο <code class=\"docutils literal notranslate\"><span class=\"pre\">self.stdout</span></code> ή στο <code class=\"docutils literal notranslate\"><span class=\"pre\">self.stderr</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=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stdout</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">style</span><span class=\"o\">.</span><span class=\"n\">SUCCESS</span><span class=\"p\">(</span><span class=\"s1\">&#39;...&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Δείτε στο <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/#syntax-coloring\"><span class=\"std std-ref\">χρωματίζοντας την έξοδο</span></a> για να μάθετε πως να τροποποιείτε την παλέτα των χρωμάτων και να δείτε τα διαθέσιμα στυλ (χρήση της έκδοσης των κεφαλαίων γραμμάτων των «ρόλων» όπως περιγράφονται σε αυτή την ενότητα).</p>\n<p>Αν δηλώσετε την επιλογή <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/#cmdoption-no-color\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--no-color</span></code></a> όταν τρέχετε την εντολή σας, όλες οι κλήσεις της <code class=\"docutils literal notranslate\"><span class=\"pre\">self.style()</span></code> θα επιστρέψουν το αρχικό string χωρίς κάποιο χρώμα.</p>\n</dd></dl>\n\n</section>\n<section id=\"methods\">\n<h3>Μέθοδοι<a class=\"heading-anchor\" href=\"#methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Η κλάση <a class=\"reference internal\" href=\"#django.core.management.BaseCommand\" title=\"django.core.management.BaseCommand\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code></a> έχει μερικές μεθόδους οι οποίες μπορούν να παρακαμφθούν (overridden) αλλά μόνο η μέθοδος <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.handle\" title=\"django.core.management.BaseCommand.handle\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">handle()</span></code></a> πρέπει να υλοποιηθεί υποχρεωτικά.</p>\n<aside class=\"admonition-implementing-a-constructor-in-a-subclass admonition\">\n<p class=\"admonition-title\">Υλοποίηση ενός constructor μέσα σε μια subclass</p>\n<p>Αν υλοποιήσετε την <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> μέσα σε μια subclass της <a class=\"reference internal\" href=\"#django.core.management.BaseCommand\" title=\"django.core.management.BaseCommand\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code></a> θα πρέπει πρώτα να καλέσετε την <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> της κλάσης <a class=\"reference internal\" href=\"#django.core.management.BaseCommand\" title=\"django.core.management.BaseCommand\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code></a>, όπως φαίνεται παρακάτω:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">BaseCommand</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">Command</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"c1\"># ...</span>\n</code></pre></div>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.add_arguments\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_arguments</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parser</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.add_arguments\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Σημείο εισόδου για να προσθέσετε arguments στο μεταφραστή (parser) για τον χειρισμό των arguments που εισάγονται στη γραμμή εντολών (όπως το argument <code class=\"docutils literal notranslate\"><span class=\"pre\">--delete</span></code> που αναφέραμε παραπάνω). Τυχόν δικές σας διαχειριστικές εντολές θα πρέπει να παρακάμπτουν αυτή τη μέθοδο για να προσθέσουν positional και optional arguments που θα δέχεται η εντολή. Η κλήση της <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> δεν είναι απαραίτητη όταν κάνετε απ’ ευθείας subclass την κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.get_version\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_version</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.get_version\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Επιστρέφει την έκδοση του Django, η οποία θα πρέπει να είναι η σωστή για όλες τις προεγκατεστημένες εντολές του Django. Τυχόν δικές σας διαχειριστικές εντολές μπορούν να παρακάμψουν αυτή τη μέθοδο για να επιστρέφουν τη δική τους έκδοση.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.execute\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">execute</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.execute\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Προσπαθεί να εκτελέσει την εντολή που γράψατε, πραγματοποιεί τυχόν τεστ που αφορά το σύστημα (ανάλογα την τιμή του attribute <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.requires_system_checks\" title=\"django.core.management.BaseCommand.requires_system_checks\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">requires_system_checks</span></code></a>). Αν η εντολή κάνει raise το exception <a class=\"reference internal\" href=\"#django.core.management.CommandError\" title=\"django.core.management.CommandError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">CommandError</span></code></a>, τότε θα εμφανιστεί ανάλογο σφάλμα στο <code class=\"docutils literal notranslate\"><span class=\"pre\">stderr</span></code>.</p>\n</dd></dl>\n\n<aside class=\"admonition-calling-a-management-command-in-your-code admonition\">\n<p class=\"admonition-title\">Καλώντας μια εντολή διαχείρισης μέσα από τον κώδικα σας</p>\n<p>Η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">execute()</span></code> δεν θα πρέπει να καλείται απ” ευθείας από τον κώδικα σας για την εκτέλεση μιας εντολής. Αντί αυτής, χρησιμοποιήστε τη συνάρτηση <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/#django.core.management.call_command\" title=\"django.core.management.call_command\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">call_command()</span></code></a>.</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.handle\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">handle</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.handle\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Η πραγματική λογική της εντολής. Όλες οι subclasses πρέπει να υλοποιήσουν αυτή τη μέθοδο.</p>\n<p>Μπορεί να επιστρέψει ένα Unicode string το οποίο θα εκτυπωθεί στο <code class=\"docutils literal notranslate\"><span class=\"pre\">stdout</span></code> (συμπεριλαμβανόμενο μέσα στα <code class=\"docutils literal notranslate\"><span class=\"pre\">BEGIN;</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">COMMIT;</span></code>, αν το attribute <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.output_transaction\" title=\"django.core.management.BaseCommand.output_transaction\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">output_transaction</span></code></a> είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.BaseCommand.check\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">check</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">app_configs</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">tags</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">display_num_errors</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.management.BaseCommand.check\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Χρησιμοποιεί το σύστημα ελέγχου του framework για να επιθεωρήσει ολόκληρο το Django project για τυχόν προβλήματα. Τα σοβαρά προβλήματα γίνονται raised ως <a class=\"reference internal\" href=\"#django.core.management.CommandError\" title=\"django.core.management.CommandError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">CommandError</span></code></a>. Τα warnings εκτυπώνονται στο <code class=\"docutils literal notranslate\"><span class=\"pre\">stderr</span></code>. Τυχόν δευτερεύουσες ειδοποιήσεις εκτυπώνονται στο <code class=\"docutils literal notranslate\"><span class=\"pre\">stdout</span></code>.</p>\n<p>Αν τα ορίσματα <code class=\"docutils literal notranslate\"><span class=\"pre\">app_configs</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code> είναι και τα δύο τύπου <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, τότε θα γίνουν όλα τα συστήματα ελέγχου. Το όρισμα <code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code> μπορεί να είναι μια λίστα από check tags, όπως <code class=\"docutils literal notranslate\"><span class=\"pre\">compatibility</span></code> ή <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"basecommand-subclasses\">\n<span id=\"ref-basecommand-subclasses\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">BaseCommand</span></code> subclasses<a class=\"heading-anchor\" href=\"#basecommand-subclasses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.AppCommand\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AppCommand</span></span><a class=\"heading-anchor\" href=\"#django.core.management.AppCommand\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Μια εντολή διαχείρισης η οποία δέχεται ως arguments (όπως το <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;poll_id&gt;</span></code> στην εντολή που γράψαμε παραπάνω <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">closepoll</span> <span class=\"pre\">&lt;poll_id&gt;</span></code>) ένα ή περισσότερα labels εφαρμογών και κάνει κάτι με καθένα από αυτά.</p>\n<p>Αντί της υλοποίησης της μεθόδου <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.handle\" title=\"django.core.management.BaseCommand.handle\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">handle()</span></code></a>, οι subclasses πρέπει να υλοποιούν τη μέθοδο <a class=\"reference internal\" href=\"#django.core.management.AppCommand.handle_app_config\" title=\"django.core.management.AppCommand.handle_app_config\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">handle_app_config()</span></code></a> η οποία θα καλείται μια φορά για κάθε εφαρμογή.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.AppCommand.handle_app_config\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">handle_app_config</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">app_config</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.management.AppCommand.handle_app_config\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Εκτελεί τις ενέργειες της εντολής για το <code class=\"docutils literal notranslate\"><span class=\"pre\">app_config</span></code> το οποίο θα είναι ένα instance της κλάσης <a class=\"reference internal\" href=\"/el/1.11/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> που αντιστοιχεί στο label της εφαρμογής που δόθηκε στη γραμμή εντολών.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.LabelCommand\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">LabelCommand</span></span><a class=\"heading-anchor\" href=\"#django.core.management.LabelCommand\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Μια εντολή διαχείρισης η οποία δέχεται ένα η περισσότερα arguments (labels) μέσω της γραμμής εντολών και κάνει κάτι με καθένα από αυτά.</p>\n<p>Αντί της υλοποίησης της μεθόδου <a class=\"reference internal\" href=\"#django.core.management.BaseCommand.handle\" title=\"django.core.management.BaseCommand.handle\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">handle()</span></code></a>, οι subclasses πρέπει να υλοποιούν τη μέθοδο <a class=\"reference internal\" href=\"#django.core.management.LabelCommand.handle_label\" title=\"django.core.management.LabelCommand.handle_label\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">handle_label()</span></code></a>, η οποία θα καλείται μια φορά για κάθε label.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.LabelCommand.label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">LabelCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label</span></span><a class=\"heading-anchor\" href=\"#django.core.management.LabelCommand.label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ένα αλφαριθμητικό (string) που περιγράφει τις παραμέτρους που δόθηκαν στην εντολή. Το αλφαριθμητικό χρησιμοποιείται στα μηνύματα σφαλμάτων καθώς και στο κείμενο περιγραφής της εντολής. Προεπιλογή είναι το <code class=\"docutils literal notranslate\"><span class=\"pre\">'label'</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.LabelCommand.handle_label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">LabelCommand.</span></span><span class=\"sig-name descname\"><span class=\"pre\">handle_label</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">label</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.management.LabelCommand.handle_label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Εκτελεί τις ενέργειες της εντολής για το <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code>, το οποίο θα είναι ένα string όπως δόθηκε στη γραμμή εντολών.</p>\n</dd></dl>\n\n</section>\n<section id=\"command-exceptions\">\n<h3>Exceptions εντολής<a class=\"heading-anchor\" href=\"#command-exceptions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py exception\">\n<dt class=\"sig sig-object py\" id=\"django.core.management.CommandError\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">exception</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CommandError</span></span><a class=\"heading-anchor\" href=\"#django.core.management.CommandError\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Μια κλάση Exception που υποδεικνύει ότι προέκυψε κάποιο πρόβλημα κατά τη διάρκεια εκτέλεσης της εντολής διαχείρισης.</p>\n<p>Αν αυτό το exception γίνει raised κατά τη διάρκεια της εκτέλεσης, μέσω της κονσόλας, μιας διαχειριστικής εντολής, θα “πιαστεί” (caught) και θα μετατραπεί σε ένα όμορφα εκτυπώσιμο μήνυμα σφάλματος το οποίο θα προωθηθεί στην ανάλογη έξοδο προβολής (πχ stderr, stdout κλπ). Επομένως, ο καλύτερος τρόπος για να υποδείξετε ότι κάτι πήγε στραβά κατά τη διάρκεια της εκτέλεσης της εντολής σας, είναι κάνοντας raise αυτό το exception (με μια λογική περιγραφή του σφάλματος που προέκυψε, φυσικά).</p>\n<p>Αν η εντολή διαχείρισης καλείται μέσα από τον κώδικα σας μέσω της συνάρτησης <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/#django.core.management.call_command\" title=\"django.core.management.call_command\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">call_command()</span></code></a>, τότε είναι δικό σας θέμα να κάνετε catch, όποτε το κρίνετε απαραίτητο, αυτό το exception.</p>\n</section>\n</section>","rootId":"module-django.core.management","toc":[{"title":"Προαιρετικά arguments","anchor":"accepting-optional-arguments","children":[]},{"title":"Εντολές διαχείρισης και locales","anchor":"management-commands-and-locales","children":[]},{"title":"Τεστ","anchor":"testing","children":[]},{"title":"Overriding commands","anchor":"overriding-commands","children":[]},{"title":"Objects εντολών","anchor":"command-objects","children":[{"title":"Attributes","anchor":"attributes","children":[]},{"title":"Μέθοδοι","anchor":"methods","children":[]},{"title":"BaseCommand subclasses","anchor":"basecommand-subclasses","children":[]},{"title":"Exceptions εντολής","anchor":"command-exceptions","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"Οδηγοί «Πως-να»","url":"/el/1.11/howto/"}],"prev":{"docname":"howto/auth-remote-user","title":"Authentication using REMOTE_USER","url":"/el/1.11/howto/auth-remote-user/"},"next":{"docname":"howto/custom-model-fields","title":"Γράφοντας δικά σας πεδία μοντέλων","url":"/el/1.11/howto/custom-model-fields/"},"formats":{"html":"/el/1.11/howto/custom-management-commands/","markdown":"/el/1.11/howto/custom-management-commands.md","json":"/el/1.11/howto/custom-management-commands.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/howto/custom-management-commands.txt","official":"https://docs.djangoproject.com/el/1.11/howto/custom-management-commands/","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","ko","es","el","pl"]}