{"title":"Μια πρώτη ματιά στο Django","version":"4.0","locale":"el","docname":"intro/overview","url":"/el/4.0/intro/overview/","canonical":"https://djangodocs.dev/el/4.0/intro/overview/","summary":"Because Django was developed in a fast-paced newsroom environment, it was designed to make common web development tasks fast and easy. Here’s an informal overview…","html":"<h1>Μια πρώτη ματιά στο Django<a class=\"heading-anchor\" href=\"#django-at-a-glance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Because Django was developed in a fast-paced newsroom environment, it was\ndesigned to make common web development tasks fast and easy. Here’s an informal\noverview of how to write a database-driven web app with Django.</p>\n<p>Ο στόχος αυτού το άρθρου είναι να σας δώσει μερικά τεχνικά στοιχεία (γνώσεις, αν θέλετε) προκειμένου να καταλάβετε πως λειτουργεί το Django. Δεν αποτελεί, ωστόσο, κάποιον οδηγό ή αναφορά για να ανατρέξετε (παρόλο που τα έχουμε και τα δύο)! Όταν είστε έτοιμοι για να ξεκινήσετε κάποιο project, μπορείτε να <a class=\"reference internal\" href=\"/el/4.0/intro/tutorial01/\"><span class=\"doc\">ξεκινήσετε με τον οδηγό (tutorial)</span></a> ή να ανατρέξετε σε πιο λεπτομερείς κείμενα <a class=\"reference internal\" href=\"/el/4.0/topics/\"><span class=\"doc\">όπως το εγχειρίδιο (documentation) του Django</span></a>.</p>\n<section id=\"design-your-model\">\n<h2>Σχεδιάστε το μοντέλο σας<a class=\"heading-anchor\" href=\"#design-your-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Το Django μπορείτε να το χρησιμοποιήσετε χωρίς τη χρήση κάποιας βάσης δεδομένων (στατικές σελίδες). Από την άλλη, για τη δημιουργία δυναμικών σελίδων, το Django σας δίνει τη δυνατότητα να σχεδιάσετε τη διάταξη της βάσης δεδομένων (database layout) σε κώδικα γραμμένο αποκλειστικά σε Python, με τη χρήση του <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Object-relational_mapping\">object-relational mapper</a> το οποίο είναι προεγκατεστημένο.</p>\n<p>Το άρθρο <a class=\"reference internal\" href=\"/el/4.0/topics/db/models/\"><span class=\"doc\">σχεδίαση μοντέλων</span></a> προσφέρει πολλούς τρόπους σχεδίασης και αναπαράστασης των μοντέλων σας – μέχρι τώρα, έχει λύσει πολλών χρόνων προβλήματα που έχουν να κάνουν με τη σχεδίαση του schema της βάσης δεδομένων. Να ένα γρήγορο παράδειγμα:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/models.py</span></code></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.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Reporter</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=\"n\">full_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">70</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</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=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">reporter</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Reporter</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">headline</span>\n</code></pre></figure>\n</section>\n<section id=\"install-it\">\n<h2>Εγκαταστήστε το<a class=\"heading-anchor\" href=\"#install-it\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Next, run the Django command-line utilities to create the database tables\nautomatically:</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>manage.py<span class=\"w\"> </span>makemigrations\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>migrate\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 manage.py makemigrations\n<span class=\"gp\">...\\&gt;</span> py manage.py migrate\n</code></pre></div></div></div>\n<p>The <a class=\"reference internal\" href=\"/el/4.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> command looks at all your available models and\ncreates migrations for whichever tables don’t already exist. <a class=\"reference internal\" href=\"/el/4.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>\nruns the migrations and creates tables in your database, as well as optionally\nproviding <a class=\"reference internal\" href=\"/el/4.0/topics/migrations/\"><span class=\"doc\">much richer schema control</span></a>.</p>\n</section>\n<section id=\"enjoy-the-free-api\">\n<h2>Απολαύστε το δωρεάν API<a class=\"heading-anchor\" href=\"#enjoy-the-free-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>With that, you’ve got a free, and rich, <a class=\"reference internal\" href=\"/el/4.0/topics/db/queries/\"><span class=\"doc\">Python API</span></a>\nto access your data. The API is created on the fly, no code generation\nnecessary:</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=\"c1\"># Import the models we created from our &quot;news&quot; app</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">news.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span><span class=\"p\">,</span> <span class=\"n\">Reporter</span>\n\n<span class=\"c1\"># No reporters are in the system yet.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Create a new Reporter.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">Reporter</span><span class=\"p\">(</span><span class=\"n\">full_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John Smith&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Now it has an ID.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">id</span>\n<span class=\"mi\">1</span>\n\n<span class=\"c1\"># Now the new reporter is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Fields are represented as attributes on the Python object.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># Django provides a rich database lookup API.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</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=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</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\">full_name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</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\">full_name__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;mith&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</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=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Traceback</span> <span class=\"p\">(</span><span class=\"n\">most</span> <span class=\"n\">recent</span> <span class=\"n\">call</span> <span class=\"n\">last</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n<span class=\"n\">DoesNotExist</span><span class=\"p\">:</span> <span class=\"n\">Reporter</span> <span class=\"n\">matching</span> <span class=\"n\">query</span> <span class=\"n\">does</span> <span class=\"ow\">not</span> <span class=\"n\">exist</span><span class=\"o\">.</span>\n\n<span class=\"c1\"># Create an article.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"p\">(</span><span class=\"n\">pub_date</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">(),</span> <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Django is cool&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>     <span class=\"n\">content</span><span class=\"o\">=</span><span class=\"s1\">&#39;Yeah.&#39;</span><span class=\"p\">,</span> <span class=\"n\">reporter</span><span class=\"o\">=</span><span class=\"n\">r</span><span class=\"p\">)</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Now the article is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Article objects get API access to related Reporter objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">reporter</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># And vice versa: Reporter objects get API access to Article objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">article_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># The API follows relationships as far as you need, performing efficient</span>\n<span class=\"c1\"># JOINs for you behind the scenes.</span>\n<span class=\"c1\"># This finds all articles by a reporter whose name starts with &quot;John&quot;.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">reporter__full_name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Change an object by altering its attributes and calling save().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Billy Goat&#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Delete an object with delete().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\">\n<h2>Ένα δυναμικό διαχειριστικό περιβάλλον: δεν είναι απλά οικοδομή – είναι ολόκληρο το σπίτι<a class=\"heading-anchor\" href=\"#a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Once your models are defined, Django can automatically create a professional,\nproduction ready <a class=\"reference internal\" href=\"/el/4.0/ref/contrib/admin/\"><span class=\"doc\">administrative interface</span></a> –\na website that lets authenticated users add, change and delete objects. The\nonly step required is to register your model in the admin site:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/models.py</span></code></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.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</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=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">reporter</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Reporter</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/admin.py</span></code></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\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</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\">models</span><span class=\"o\">.</span><span class=\"n\">Article</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>The philosophy here is that your site is edited by a staff, or a client, or\nmaybe just you – and you don’t want to have to deal with creating backend\ninterfaces only to manage content.</p>\n<p>Ένας τυπικός μπούσουλας στη σχεδίαση Django apps είναι να δημιουργείτε μοντέλα και αμέσως μετά να τα καταχωρείτε (register) με το admin site ούτως ώστε να μπορείτε να τα διαχειρίζεστε όσο γίνεται πιο γρήγορα. Έτσι, το προσωπικό σας (ή οι πελάτες σας) θα μπορούν να καταχωρούν δεδομένα (περιεχόμενο) και να αναπτύξουν το τρόπο με το οποίο θα τα παρουσιάσουν στο ευρύ κοινό.</p>\n</section>\n<section id=\"design-your-urls\">\n<h2>Σχεδίαση των URLs<a class=\"heading-anchor\" href=\"#design-your-urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>A clean, elegant URL scheme is an important detail in a high-quality web\napplication. Django encourages beautiful URL design and doesn’t put any cruft\nin URLs, like <code class=\"docutils literal notranslate\"><span class=\"pre\">.php</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">.asp</span></code>.</p>\n<p>To design URLs for an app, you create a Python module called a <a class=\"reference internal\" href=\"/el/4.0/topics/http/urls/\"><span class=\"doc\">URLconf</span></a>. A table of contents for your app, it contains a mapping\nbetween URL patterns and Python callback functions. URLconfs also serve to\ndecouple URLs from Python code.</p>\n<p>Ένα URLconf module θα έδειχνε κάπως έτσι, αναφορικά με το παράδειγμα <code class=\"docutils literal notranslate\"><span class=\"pre\">Reporter</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> πιο πάνω:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/urls.py</span></code></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.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">year_archive</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&lt;int:month&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">month_archive</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&lt;int:month&gt;/&lt;int:pk&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">article_detail</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>The code above maps URL paths to Python callback functions («views»). The path\nstrings use parameter tags to «capture» values from the URLs. When a user\nrequests a page, Django runs through each path, in order, and stops at the\nfirst one that matches the requested URL. (If none of them matches, Django\ncalls a special-case 404 view.) This is blazingly fast, because the paths are\ncompiled into regular expressions at load time.</p>\n<p>Once one of the URL patterns matches, Django calls the given view, which is a\nPython function. Each view gets passed a request object – which contains\nrequest metadata – and the values captured in the pattern.</p>\n<p>For example, if a user requested the URL «/articles/2005/05/39323/», Django\nwould call the function <code class=\"docutils literal notranslate\"><span class=\"pre\">news.views.article_detail(request,</span>\n<span class=\"pre\">year=2005,</span> <span class=\"pre\">month=5,</span> <span class=\"pre\">pk=39323)</span></code>.</p>\n</section>\n<section id=\"write-your-views\">\n<h2>Γράψτε τα views σας<a class=\"heading-anchor\" href=\"#write-your-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Κάθε view είναι υπεύθυνο να κάνει ένα από δύο πράγματα: Θα επιστρέφει ένα <a class=\"reference internal\" href=\"/el/4.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> object το οποίο θα περιέχει τα δεδομένα της ζητούμενης σελίδας ή θα κάνει raise κάποιο exception όπως το <a class=\"reference internal\" href=\"/el/4.0/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a>. Τα υπόλοιπα άπτονται σε εσάς.</p>\n<p>Γενικά, ένα view ανακτά τα δεδομένα ανάλογα τις παραμέτρους, φορτώνει το template και κάνει render το template με τα δεδομένα που ανέκτησε. Αναφερόμενοι στο παραπάνω παράδειγμα και πιο συγκεκριμένα στο πρώτο URL regex, θα υλοποιήσουμε το <code class=\"docutils literal notranslate\"><span class=\"pre\">year_archive</span></code> view:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/views.py</span></code></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.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</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\">Article</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">year_archive</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">year</span><span class=\"p\">):</span>\n    <span class=\"n\">a_list</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"n\">year</span><span class=\"p\">)</span>\n    <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;year&#39;</span><span class=\"p\">:</span> <span class=\"n\">year</span><span class=\"p\">,</span> <span class=\"s1\">&#39;article_list&#39;</span><span class=\"p\">:</span> <span class=\"n\">a_list</span><span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;news/year_archive.html&#39;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Αυτό το παράδειγμα χρησιμοποιεί το <a class=\"reference internal\" href=\"/el/4.0/topics/templates/\"><span class=\"doc\">template system</span></a> του Django, το οποίο παρέχει πολλά ισχυρά χαρακτηριστικά και παράλληλα προσπαθεί να παραμείνει απλό στη χρήση του για αυτούς που δεν είναι προγραμματιστές.</p>\n</section>\n<section id=\"design-your-templates\">\n<h2>Σχεδιάστε τα templates σας<a class=\"heading-anchor\" href=\"#design-your-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ο κώδικας παραπάνω φορτώνει το template με το όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">news/year_archive.html</span></code>.</p>\n<p>Το Django έχει ειδική μηχανή αναζήτησης template, η οποία επιτρέπει στην ελαχιστοποίηση της επαναληπτικότητας (redundancy) ανάμεσα στα templates. Στις ρυθμίσεις (settings) του Django, καθορίζετε μία λίστα από φακέλους (directories) στους οποίους θα κοιτάξει το Django να βρει το αντίστοιχο template αρχείο. Η ρύθμιση αυτή γίνεται μέσω του <a class=\"reference internal\" href=\"/el/4.0/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a>. Αν ένα template δεν βρεθεί στον πρώτο φάκελο τότε εξερευνάται ο δεύτερος κοκ.</p>\n<p>Ας υποθέσουμε ότι το template <code class=\"docutils literal notranslate\"><span class=\"pre\">news/year_archive.html</span></code> βρέθηκε. Αυτό θα μοιάζει κάπως έτσι:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/templates/news/year_archive.html</span></code></figcaption>\n<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\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">article</span> <span class=\"k\">in</span> <span class=\"nv\">article_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">article.headline</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>By <span class=\"cp\">{{</span> <span class=\"nv\">article.reporter.full_name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Published <span class=\"cp\">{{</span> <span class=\"nv\">article.pub_date</span><span class=\"o\">|</span><span class=\"nf\">date</span><span class=\"s2\">:&quot;F j, Y&quot;</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>Οι μεταβλητές περιβάλλονται από διπλές αγκύλες. Το <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">article.headline</span> <span class=\"pre\">}}</span></code>\nσημαίνει «Δώσε μου την τιμή του headline attribute του object article». Αλλά οι τελείες δεν χρησιμοποιούνται μόνο για να ανακαλούμε τα attributes ενός object. Χρησιμεύουν επίσης και για να ψάχνουμε μέσα σε Python dictionaries, μέσα σε Python λίστες (lists) καθώς και για να καλούμε μεθόδους ενός object.</p>\n<p>Σημειώστε ότι το <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">article.pub_date|date:&quot;F</span> <span class=\"pre\">j,</span> <span class=\"pre\">Y&quot;</span> <span class=\"pre\">}}</span></code> χρησιμοποιεί ένα στυλ του Unix που λέγεται «pipe» (ο χαρακτήρας «|»). Αυτό ονομάζεται template filter και είναι ένας τρόπος να φιλτράρουμε την τιμή ή την μεταβλητή. Στην συγκεκριμένη περίπτωση, το φίλτρο με το όνομα “date” φιλτράρει το Python datetime object ούτως ώστε να παρουσιαστεί σε μία συγκεκριμένη μορφή (σύμφωνα με την συνάρτηση date της γλώσσας PHP).</p>\n<p>Μπορείτε να συνδέσετε (chain) περισσότερα από ένα φίλτρα, ανάλογα τις απαιτήσεις σας. Μπορείτε να γράψετε <a class=\"reference internal\" href=\"/el/4.0/howto/custom-template-tags/#howto-writing-custom-template-filters\"><span class=\"std std-ref\">δικά σας template filters</span></a>. Μπορείτε να γράψετε <a class=\"reference internal\" href=\"/el/4.0/howto/custom-template-tags/\"><span class=\"doc\">δικά σας template tags</span></a>, τα οποία θα τρέχουν το δικό σας Python κώδικα στο παρασκήνιο.</p>\n<p>Εν κατακλείδι, το Django χρησιμοποιεί την έννοια του «template inheritance». Αν προσέξατε, στην αρχή του template υπάρχει το <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">&quot;base.html&quot;</span> <span class=\"pre\">%}</span></code>. Αυτό σημαίνει «πρώτα φόρτωσε το template με το όνομα “base.html”, το οποίο “base” έχει ορίσει κάποια τμήματα blocks (όπως είναι το title και το content) και αντικατέστησε τα κομμάτια αυτά του “base.html” με αυτά του year_archive.html». Με άλλα λόγια, το Django template system ελαχιστοποιεί στο έπακρο την επαναληπτικότητα ανάμεσα στα template σας: κάθε template θα πρέπει να ορίζει μόνο ότι είναι μοναδικό στο δικό του template.</p>\n<p>Δείτε και το «base.html» template, συμπεριλαμβανομένου και του <a class=\"reference internal\" href=\"/el/4.0/howto/static-files/\"><span class=\"doc\">static files</span></a> template tag:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/templates/base.html</span></code></figcaption>\n<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\">load</span> <span class=\"nv\">static</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">img</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">static</span> <span class=\"s1\">&#39;images/sitelogo.png&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">alt</span><span class=\"o\">=</span><span class=\"s\">&quot;Logo&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Simplistically, it defines the look-and-feel of the site (with the site’s logo),\nand provides «holes» for child templates to fill. This means that a site redesign\ncan be done by changing a single file – the base template.</p>\n<p>It also lets you create multiple versions of a site, with different base\ntemplates, while reusing child templates. Django’s creators have used this\ntechnique to create strikingly different mobile versions of sites by only\ncreating a new base template.</p>\n<p>Σημειώστε επίσης ότι δεν χρειάζεται να χρησιμοποιήσετε το template system του Django αν δεν σας ταιριάζει. Ενώ δουλεύει και επικοινωνεί εξαιρετικά με το model layer του Django, μπορείτε να χρησιμοποιήσετε κάποιο άλλο template system. Με την ίδια λογική μπορείτε να αλλάξετε και το API για την επικοινωνία με την βάση δεδομένων. Μπορείτε να δουλέψετε με άλλο abstraction layer βάσης δεδομένων, να διαβάζετε XML αρχεία, να διαβάζετε αρχεία εκτός δίσκου ή οτιδήποτε θέλετε. Κάθε κομμάτι του Django – models, views, templates – είναι αποσυνδεδεμένο με το επόμενο.</p>\n</section>\n<section id=\"this-is-just-the-surface\">\n<h2>Και αυτό είναι μόνο η επιφάνεια<a class=\"heading-anchor\" href=\"#this-is-just-the-surface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Αυτό το άρθρο ήταν μόνο μια γρήγορη προεπισκόπηση των δυνατοτήτων και λειτουργιών του Django. Μερικά πιο χρήσιμα χαρακτηριστικά είναι:</p>\n<ul class=\"simple\">\n<li><p>Το <a class=\"reference internal\" href=\"/el/4.0/topics/cache/\"><span class=\"doc\">caching framework</span></a> το οποίο ενσωματώνεται με το memcached ή άλλα backends.</p></li>\n<li><p>A <a class=\"reference internal\" href=\"/el/4.0/ref/contrib/syndication/\"><span class=\"doc\">syndication framework</span></a> that lets you\ncreate RSS and Atom feeds by writing a small Python class.</p></li>\n<li><p>More attractive automatically-generated admin features – this overview\nbarely scratched the surface.</p></li>\n</ul>\n<p>The next steps are for you to <a class=\"reference external\" href=\"https://www.djangoproject.com/download/\">download Django</a>, read <a class=\"reference internal\" href=\"/el/4.0/intro/tutorial01/\"><span class=\"doc\">the tutorial</span></a> and join <a class=\"reference external\" href=\"https://www.djangoproject.com/community/\">the community</a>. Thanks for your interest!</p>\n</section>","rootId":"django-at-a-glance","toc":[{"title":"Σχεδιάστε το μοντέλο σας","anchor":"design-your-model","children":[]},{"title":"Εγκαταστήστε το","anchor":"install-it","children":[]},{"title":"Απολαύστε το δωρεάν API","anchor":"enjoy-the-free-api","children":[]},{"title":"Ένα δυναμικό διαχειριστικό περιβάλλον: δεν είναι απλά οικοδομή – είναι ολόκληρο το σπίτι","anchor":"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house","children":[]},{"title":"Σχεδίαση των URLs","anchor":"design-your-urls","children":[]},{"title":"Γράψτε τα views σας","anchor":"write-your-views","children":[]},{"title":"Σχεδιάστε τα templates σας","anchor":"design-your-templates","children":[]},{"title":"Και αυτό είναι μόνο η επιφάνεια","anchor":"this-is-just-the-surface","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Ξεκινώντας","url":"/el/4.0/intro/"}],"prev":{"docname":"intro/index","title":"Ξεκινώντας","url":"/el/4.0/intro/"},"next":{"docname":"intro/install","title":"Οδηγός γρήγορης εγκατάστασης","url":"/el/4.0/intro/install/"},"formats":{"html":"/el/4.0/intro/overview/","markdown":"/el/4.0/intro/overview.md","json":"/el/4.0/intro/overview.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/intro/overview.txt","official":"https://docs.djangoproject.com/el/4.0/intro/overview/","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","it","pt-br","ko","es","el","pl"]}