{"title":"Pisanie pierwszej aplikacji Django, część 1.","version":"2.1","locale":"pl","docname":"intro/tutorial01","url":"/pl/2.1/intro/tutorial01/","canonical":"https://djangodocs.dev/pl/2.1/intro/tutorial01/","summary":"Nauczmy się na przykładzie. Z pomocą tego tutoriala przeprowadzimy cię przez stworzenie prostej aplikacji ankietowej. Będzie się ona składać z dwóch części:…","html":"<h1>Pisanie pierwszej aplikacji Django, część 1.<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-1\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Nauczmy się na przykładzie.</p>\n<p>Z pomocą tego tutoriala przeprowadzimy cię przez stworzenie prostej aplikacji ankietowej.</p>\n<p>Będzie się ona składać z dwóch części:</p>\n<ul class=\"simple\">\n<li><p>Publicznej strony, która pozwala ludziom obejrzeć ankiety i głosować w nich.</p></li>\n<li><p>Panelu administracyjnego, który pozwala ci dodawać, zmieniać i usuwać ankiety.</p></li>\n</ul>\n<p>Będziemy zakładać, że masz już <a class=\"reference internal\" href=\"/pl/2.1/intro/install/\"><span class=\"doc\">zainstalowane Django</span></a>. Możesz sprawdzić, czy Django jest zainstalowane i w jakiej wersji uruchamiając następującą komendę w prompcie powłoki (wskazywanym przez prefix $):</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>-m<span class=\"w\"> </span>django<span class=\"w\"> </span>--version\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 -m django --version\n</code></pre></div></div></div>\n<p>Jeśli Django jest zainstalowane, powinieneś zobaczyć wersję swojej instalacji. Jeśli nie jest, dostaniesz błąd „No module named django”.</p>\n<p>Ten tutorial jest napisany dla Django 2.1, które wspiera Pythona 3.5 i wyższe. Jeśli wersja Django się nie zgadza, możesz przełączyć się na swoją wersję Django używając przełącznika wersji w prawym dolnym rogu tej strony lub możesz zaktualizować Django do najnowszej wersji. Jeśli używasz starszej wersji Pythona, sprawdź <a class=\"reference internal\" href=\"/pl/2.1/faq/install/#faq-python-version-support\"><span class=\"std std-ref\">Której wersji Pythona mogę użyć z Django?</span></a>, aby znaleźć kompatybilną wersję Django.</p>\n<p>Zobacz <a class=\"reference internal\" href=\"/pl/2.1/topics/install/\"><span class=\"doc\">Jak zainstalować Django</span></a>, by znaleźć wskazówki jak usunąć stare wersje Django i zainstalować nową.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Gdzie szukać pomocy:</p>\n<p>Jeśli masz problemy z przejściem tego tutoriala, prosimy napisz wiadomość do <a class=\"reference internal\" href=\"/pl/2.1/internals/mailing-lists/#django-users-mailing-list\"><span class=\"std std-ref\">django-users</span></a> lub wpadnij na <a class=\"reference external\" href=\"irc://irc.freenode.net/django\">#django na irc.freenode.net</a>, aby czatować z innymi użytkownikami Django, który mogą być w stanie udzielić pomocy.</p>\n</aside>\n<section id=\"creating-a-project\">\n<h2>Tworzenie projektu<a class=\"heading-anchor\" href=\"#creating-a-project\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Jeśli po raz pierwszy korzystasz z Django, będziesz musiał zająć się wstępną konfiguracją. Konkretnie, będziesz potrzebował wygenerować trochę kodu, który stworzy <a class=\"reference internal\" href=\"/pl/2.1/glossary/#term-project\"><span class=\"xref std std-term\">projekt</span></a> Django – zbiór ustawień dla instacji Django, wliczając konfigurację bazy danych, ustawienia specyficzne dla Django i specyficzne dla aplikacji.</p>\n<p>Z linii komend, wejdź <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> do katalogu, gdzie chciałbyś przechowywać swój kod, następnie uruchom następującą komendę:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-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>django-admin<span class=\"w\"> </span>startproject<span class=\"w\"> </span>mysite\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-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> django-admin startproject mysite\n</code></pre></div></div></div>\n<p>Stworzy ona katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite</span></code> w twoim bieżącym katalogu. Jeśli nie zadziałała, zobacz <a class=\"reference internal\" href=\"/pl/2.1/faq/troubleshooting/#troubleshooting-django-admin\"><span class=\"std std-ref\">Problemy z uruchomieniem django-admin</span></a>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Informacja</p>\n<p>Musisz unikać nazywania projektów tak samo jak wbudowane w Pythona albo Django komponenty. W szczególności znaczy to, że powinieneś unikać używania nazw jak <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> (co wejdzie w konflikt z samym Django) lub <code class=\"docutils literal notranslate\"><span class=\"pre\">test</span></code> (wejdzie w konflikt z wbudowanym pakietem Pythona).</p>\n</aside>\n<aside class=\"admonition-where-should-this-code-live admonition\">\n<p class=\"admonition-title\">Gdzie powinien żyć ten kod?</p>\n<p>Jeśli w przeszłości używałeś zwykłego starego PHP (bez użycia nowoczesnych frameworków), prawdopodobnie zwykłeś umieszczać kod w głównym katalogu serwera WWW (takim jak <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/www</span></code>). W Django nie robi się w ten sposób. Nie jest dobrym pomysłem umieszczać jakiegokolwiek z tego kodu Pythona w katalogu głównym serwera WWW, ponieważ stwarza to ryzyko pojawienia się możliwości, aby ktoś był w stanie widzieć twój kod w Internecie. Nie jest to bezpieczne.</p>\n<p>Umieść swój kod w jakimś katalogu <strong>poza</strong> katalogiem głównym, na przykład w <code class=\"file docutils literal notranslate\"><span class=\"pre\">/home/mycode</span></code>.</p>\n</aside>\n<p>Spójrzmy co stworzyło <a class=\"reference internal\" href=\"/pl/2.1/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</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=\"n\">mysite</span><span class=\"o\">/</span>\n    <span class=\"n\">manage</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">mysite</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">wsgi</span><span class=\"o\">.</span><span class=\"n\">py</span>\n</code></pre></div>\n<p>Te pliki to:</p>\n<ul class=\"simple\">\n<li><p>Zewnętrzny katalog główny <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/</span></code> jest tylko pojemnikiem na twój projekt. Jego nazwa nie ma znaczenia dla Django; możesz zmienić jego nazwę na dowolną, jaką chcesz.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>: Narzędzie linii komend, które pozwala ci oddziaływać z tym projektem Django na wiele sposobów. Możesz przeczytać szczegóły na temat <code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> w <a class=\"reference internal\" href=\"/pl/2.1/ref/django-admin/\"><span class=\"doc\">django-admin and manage.py</span></a>.</p></li>\n<li><p>Wewnętrzny katalog <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/</span></code> jest właściwym pakietem Pythona dla twojego projektu. Jego nazwa jest nazwą pakietu Pythona, którą musisz używać, aby zaimportować cokolwiek w tym pakiecie (np. <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite.urls</span></code>).</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/__init__.py</span></code>: Pusty plik, który mówi Pythonowi, że ten katalog powinien być uważany za pakiet Pythona. Jeśli jesteś początkujący w Pythonie, przeczytaj <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/modules.html#tut-packages\" title=\"(w Python v3.14)\"><span class=\"xref std std-ref\">więcej o pakietach</span></a> w oficjalnej dokumentacji Pythona.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code>: Ustawienia/konfiguracja dla tego projektu Django. <a class=\"reference internal\" href=\"/pl/2.1/topics/settings/\"><span class=\"doc\">Django settings</span></a> powie ci wszystko o tym, jak działają ustawienia.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/urls.py</span></code>: Deklaracje URL-i dla tego projektu Django; „spis treści” twojej strony opartej na Django. Możesz przeczytać więcej o URL-ach w <a class=\"reference internal\" href=\"/pl/2.1/topics/http/urls/\"><span class=\"doc\">URL dispatcher</span></a>.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/wsgi.py</span></code>: Punkt wejściowy dla serwerów WWW kompatybilnych z WSGI do serwowania twojego projektu. Zobacz <a class=\"reference internal\" href=\"/pl/2.1/howto/deployment/wsgi/\"><span class=\"doc\">How to deploy with WSGI</span></a> dla większej ilości szczegółów.</p></li>\n</ul>\n</section>\n<section id=\"the-development-server\">\n<h2>Serwer deweloperski<a class=\"heading-anchor\" href=\"#the-development-server\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Zweryfikujmy czy twój projekt Django działa. Przejdź do zewnętrzenego katalogu <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite</span></code>, jeśli jeszcze tego nie zrobiłeś, i uruchom następujące polecenia:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-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>runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-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 runserver\n</code></pre></div></div></div>\n<p>Zobaczysz następujące wyjście w linii komend:</p>\n<pre class=\"literal-block\">Performing system checks...\n\nSystem check identified no issues (0 silenced).\n\nYou have unapplied migrations; your app may not work properly until they are applied.\nRun 'python manage.py migrate' to apply them.\n\n09 sie 2026 - 15:50:53\nDjango version 2.1, using settings 'mysite.settings'\nStarting development server at <a class=\"reference external\" href=\"http://127.0.0.1:8000/\">http://127.0.0.1:8000/</a>\nQuit the server with CONTROL-C.</pre>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Informacja</p>\n<p>Zignoruj na razie ostrzeżenie o niezastosowanych migracjach bazy danych; zajmiemy się bazą danych za chwilę.</p>\n</aside>\n<p>Wystartowałeś serwer deweloperski Django, lekki web-serwer napisany w całości w Pythonie. Zawarliśmy go w Django, abyś mógł dewelopować rzeczy błyskawicznie, nie musząc zajmować się konfiguracją produkcyjnego serwera – jak na przykład Apache – dopóki nie będziesz gotowy na produkcję.</p>\n<p>Teraz jest dobry moment, by zwrócić na to uwagę: <strong>nie</strong> używaj tego serwera w czymkolwiek podobnym do produkcyjnego środowiska. Jest on przewidziany tylko do użytku podczas dewelopmentu. (Jesteśmy w świecie tworzenia web-frameworków, nie web-serwerów.)</p>\n<p>Kiedy serwer jest już uruchomiony, odwiedź <a class=\"reference external\" href=\"http://127.0.0.1:8000/\">http://127.0.0.1:8000/</a> w swojej przeglądarce internetowej. Zobaczysz stronę „Gratulacje!” ze startującą rakietą. Zadziałało!</p>\n<aside class=\"admonition-changing-the-port admonition\">\n<p class=\"admonition-title\">Zmiana portu</p>\n<p>Domyślnie komenda <a class=\"reference internal\" href=\"/pl/2.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a> uruchamia serwer deweloperski na wewnętrznym IP na porcie 8000.</p>\n<p>Jeśli chcesz zmienić port serwera, podaj go jako argument w linii komend. Na przykład, to polecenie uruchamia serwer na porcie 8080:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-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>runserver<span class=\"w\"> </span><span class=\"m\">8080</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-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 runserver 8080\n</code></pre></div></div></div>\n<p>Jeśli chcesz zmienić IP serwera, podaj je razem z portem. Na przykład aby nasłuchiwać na wszystkich dostępnych publicznych IP (przydatne, jeśli używasz Vagranta lub chcesz zaprezentować swoją pracę na innych komputerach w sieci), użyj:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-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>runserver<span class=\"w\"> </span><span class=\"m\">0</span>:8000\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-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 runserver 0:8000\n</code></pre></div></div></div>\n<p><strong>0</strong> jest skrótem od <strong>0.0.0.0</strong>. Pełną dokumentację serwera deweloperskiego można znaleźć w dokumentacji <a class=\"reference internal\" href=\"/pl/2.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a>.</p>\n</aside>\n<aside class=\"admonition-automatic-reloading-of-djadmin-runserver admonition\">\n<p class=\"admonition-title\">Automatyczne przeładowywanie <a class=\"reference internal\" href=\"/pl/2.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a></p>\n<p>Serwer deweloperski automatycznie przeładowuje kod Pythona dla każdego żądania, wedle potrzeby. Nie musisz restartować serwera, aby zmiany w kodzie miały efekt. Jednakże niektóre działania, jak dodawanie plików, nie powodują restartu, więc będziesz musiał zrestartować serwer w tych przypadkach.</p>\n</aside>\n</section>\n<section id=\"creating-the-polls-app\">\n<h2>Tworzenie aplikacji Ankiety<a class=\"heading-anchor\" href=\"#creating-the-polls-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Teraz, kiedy twoje środowisko – „projekt” – jest uruchomione, jesteś gotowy zabrać się do pracy.</p>\n<p>Każda aplikacjia, którą piszesz w Django, składa się z pakietu Pythona, który realizuję pewną konwencję. Django zawiera narzędzie, które automatycznie generuje podstawową strukturę katalogów aplikacji, abyś mógł skupić się na pisaniu kodu zamiast na tworzeniu katalogów.</p>\n<aside class=\"admonition-projects-vs-apps admonition\">\n<p class=\"admonition-title\">Projekty versus aplikacje</p>\n<p>Jaka jest różnica pomiędzy projektem a aplikacją? Aplikacja jest aplikacją webową, która coś robi – na przykład system blogowy, baza danych publicznych wpisów lub prosta aplikacja ankietowa. Projekt jest zbiorem konfiguracji i aplikacji dla konkretnej witryny. Projekt może zawierać wiele aplikacji. Aplikacja może być w wielu projektach.</p>\n</aside>\n<p>Twoje aplikacje mogą żyć gdziekolwiek na twojej <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/modules.html#tut-searchpath\" title=\"(w Python v3.14)\"><span class=\"xref std std-ref\">ścieżce Pythona</span></a>. W tym tutorialu stworzymy aplikację ankietową tuż obok twojego pliku <code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>, aby mogła być zaimportowana jako jego własny moduł najwyższego poziomu, zamiast podmodułu <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite</span></code>.</p>\n<p>Aby stworzyć swoją aplikację, upewnij się, że jesteś w tym samym katalogu co <code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> i wpisz tę komendę:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-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>startapp<span class=\"w\"> </span>polls\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-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 startapp polls\n</code></pre></div></div></div>\n<p>Stworzy ona katalog <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls</span></code>, który jest tak rozplanowany:</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\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">migrations</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\">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>Ta struktora katalogów będzie domem dla aplikacji ankietowej.</p>\n</section>\n<section id=\"write-your-first-view\">\n<h2>Napisz swój pierwszy widok<a class=\"heading-anchor\" href=\"#write-your-first-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Napiszmy pierwszy widok. Otwórz plik <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/views.py</span></code> i umieść tam następujący pythonowy kod:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">index</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello, world. You&#39;re at the polls index.&quot;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>To jest najprostszy widok, jaki jest możliwy w Django. Aby go wywołać, potrzebujemy zmapować go na URL – i do tego potrzebujemy URLconf.</p>\n<p>Aby stworzyć URLconf w katalogu ankiet, stwórzmy plik o nazwie <code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code>. Katalog twojej aplikacji powinien teraz wyglądać tak:</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\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">migrations</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\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">urls</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>W pliku <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/urls.py</span></code> zawrzyj następujący kod:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.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;&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Następnym krokiem jest wskazanie URLconfowi w korzeniu na moduł <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.urls</span></code>. W <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/urls.py</span></code> dodaj import dla <code class=\"docutils literal notranslate\"><span class=\"pre\">django.urls.include</span></code> i wstaw <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a> na listę <code class=\"docutils literal notranslate\"><span class=\"pre\">urlpatterns</span></code>, aby mieć:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<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\">include</span><span class=\"p\">,</span> <span class=\"n\">path</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;polls/&#39;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls.urls&#39;</span><span class=\"p\">)),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;admin/&#39;</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">urls</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Funkcja <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a> function pozwala na odniesienia do innych URLconfów. Kiedykolwiek Django napotyka <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a>, odcina tę część URL-a, która została dopasowana do tego punktu i wysyła pozostłą część ciągu znaków do zaincludowanego URLconfa, do dalszego przetworzenia.</p>\n<p>Pomysłem leżącym za <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a> jest ułatwienie podłączania URL-i. Skoro ankiety są w swoim własnym URLconfie (<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/urls.py</span></code>), mogą być umieszczone pod „/polls/” lub pod „/fun_polls/” lub pod „/content/polls/” lub dowolnym innym początkiem ścieżki i aplikacja wciąż będzie działać.</p>\n<aside class=\"admonition-when-to-use-func-django-urls-include admonition\">\n<p class=\"admonition-title\">Kiedy używać <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a></p>\n<p>Powinieneś używać <code class=\"docutils literal notranslate\"><span class=\"pre\">include()</span></code> zawsze, gdy uwzględniasz inne wzorce URL. <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.urls</span></code> jest jedynym wyjątkiem od tej reguły.</p>\n</aside>\n<p>Podłączyłeś właśnie widok <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code> do URLconf. Zweryfikujmy, czy działa. Uruchom następujące polecenie:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-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>runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-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 runserver\n</code></pre></div></div></div>\n<p>Przejdź do <a class=\"reference external\" href=\"http://localhost:8000/polls/\">http://localhost:8000/polls/</a> w swojej przeglądarce. Powinieneś zobaczyć napis „<em>Hello, world. You’re at the polls index.</em>”, który zdefiniowałeś w widoku <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code>.</p>\n<aside class=\"admonition-page-not-found admonition\">\n<p class=\"admonition-title\">Strona nie została znaleziona?</p>\n<p>Jeśli dostajesz tutaj stronę błędu, upewnij się, że wchodzisz na <a class=\"reference external\" href=\"http://localhost:8000/polls/\">http://localhost:8000/polls/</a>, a nie na <a class=\"reference external\" href=\"http://localhost:8000/\">http://localhost:8000/</a>.</p>\n</aside>\n<p>Do funkcji <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a> są przekazane cztery argumenty, dwa wymagane: <code class=\"docutils literal notranslate\"><span class=\"pre\">route</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">view</span></code> oraz dwa opcjonalne: <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>. Warto w tym momencie dowiedzieć się, do czego służą.</p>\n<section id=\"path-argument-route\">\n<h3>Argument <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">route</span></code><a class=\"heading-anchor\" href=\"#path-argument-route\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">route</span></code> jest ciągiem znaków, który zawiera wzorzec URL. Django zaczyna od pierwszego wzorca i idzie w dół listy, porównując zażądany URL z wszystkimi wzorcami aż odnajdzie taki, który pasuje.</p>\n<p>Wzorce nie przeszukują parametrów GET i POST lub nazwy domeny. Na przykład, w żądaniu do <code class=\"docutils literal notranslate\"><span class=\"pre\">https://www.example.com/myapp/</span></code>, URLconf będzie szukał <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/</span></code>. W żądaniu do <code class=\"docutils literal notranslate\"><span class=\"pre\">https://www.example.com/myapp/?page=3</span></code>, URLconf też będzie szukał <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/</span></code>.</p>\n</section>\n<section id=\"path-argument-view\">\n<h3>Argument <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">view</span></code><a class=\"heading-anchor\" href=\"#path-argument-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Kiedy Django znajdzie pasujący wzorzec, wywołuje podaną funkcję widoku z obiektem <a class=\"reference internal\" href=\"/pl/2.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> jako pierwszym argumentem i dowolnymi „złapanymi” wartościami ze ścieżki jako argumentami nazwanymi. Za chwilę damy tego przykład.</p>\n</section>\n<section id=\"path-argument-kwargs\">\n<h3>Argument <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code><a class=\"heading-anchor\" href=\"#path-argument-kwargs\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Arbitralne argumenty słownikowe mogą być przekazane w słowniku do docelowego widoku. Nie będziemy używać tej funkcjonalności Django w tym tutorialu.</p>\n</section>\n<section id=\"path-argument-name\">\n<h3>Argument <a class=\"reference internal\" href=\"/pl/2.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code><a class=\"heading-anchor\" href=\"#path-argument-name\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Nazwanie twojego URL-a pozwala odwołać się do niego jednoznacznie z każdego miejsca w Django, szczególnie z wnętrza szablonów. Ta potężna cecha pozwala ci na robienie globalnych zmian we wzorcach URL projektu przez zmianę w pojedynczym pliku.</p>\n<p>Jeśli czujesz się dobrze z przepływem żądań i odpowiedzi, przeczytaj <a class=\"reference internal\" href=\"/pl/2.1/intro/tutorial02/\"><span class=\"doc\">drugą część tego tutoriala</span></a>, aby zacząć pracę z bazą danych.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-1","toc":[{"title":"Tworzenie projektu","anchor":"creating-a-project","children":[]},{"title":"Serwer deweloperski","anchor":"the-development-server","children":[]},{"title":"Tworzenie aplikacji Ankiety","anchor":"creating-the-polls-app","children":[]},{"title":"Napisz swój pierwszy widok","anchor":"write-your-first-view","children":[{"title":"Argument path(): route","anchor":"path-argument-route","children":[]},{"title":"Argument path(): view","anchor":"path-argument-view","children":[]},{"title":"Argument path(): kwargs","anchor":"path-argument-kwargs","children":[]},{"title":"Argument path(): name","anchor":"path-argument-name","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Pierwsze kroki","url":"/pl/2.1/intro/"}],"prev":{"docname":"intro/install","title":"Przewodnik szybkiej instalacji","url":"/pl/2.1/intro/install/"},"next":{"docname":"intro/tutorial02","title":"Pisanie pierwszej aplikacji Django, część 2.","url":"/pl/2.1/intro/tutorial02/"},"formats":{"html":"/pl/2.1/intro/tutorial01/","markdown":"/pl/2.1/intro/tutorial01.md","json":"/pl/2.1/intro/tutorial01.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/intro/tutorial01.txt","official":"https://docs.djangoproject.com/pl/2.1/intro/tutorial01/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}