{"title":"Pisanie pierwszej aplikacji Django, część 3.","version":"6.1","locale":"pl","docname":"intro/tutorial03","url":"/pl/6.1/intro/tutorial03/","canonical":"https://djangodocs.dev/pl/6.1/intro/tutorial03/","summary":"Ten tutorial zaczyna się, gdzie skończył się Tutorial 2. Kontynuujemy z aplikacją web-ankiet i skupimy się na tworzeniu publicznego interfejsu – „widoków”.","html":"<h1>Pisanie pierwszej aplikacji Django, część 3.<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-3\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ten tutorial zaczyna się, gdzie skończył się <a class=\"reference internal\" href=\"/pl/6.1/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>. Kontynuujemy z aplikacją web-ankiet i skupimy się na tworzeniu publicznego interfejsu – „widoków”.</p>\n<aside class=\"admonition-where-to-get-help admonition\" role=\"note\">\n<p class=\"admonition-title\">Gdzie szukać pomocy:</p>\n<p>Jeśli masz trudności w przejściu tego tutorialu, przejdź do sekcji <a class=\"reference internal\" href=\"/pl/6.1/faq/help/\"><span class=\"doc\">Uzyskiwanie pomocy</span></a> często zadawanych pytań.</p>\n</aside>\n<section id=\"overview\">\n<h2>Przegląd<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Widok jest „typem” strony internetowej w tworzej aplikacji Django, który w ogólności służy określonej funkcji i ma określony szablon. Na przykład w aplikacji blogowej, możesz mieć następujące widoki:</p>\n<ul class=\"simple\">\n<li><p>Strona główna bloga – wyświetla kilka najnowszych wpisów.</p></li>\n<li><p>Strona „szczegółów” wpisu – strona na pojedynczy wpis.</p></li>\n<li><p>Roczna strona archiwum – wyświetla wszystkie miesiące z wpisami w danym roku.</p></li>\n<li><p>Miesięczna strona archiwum – wyświetla wszystkie dni z wpisami w danym miesiącu.</p></li>\n<li><p>Dzienna strona archiwum – wyświetla wszystkie wpisy z danego dnia.</p></li>\n<li><p>Komentowanie – obsługuje dodawanie komentarzy do danego wpisu.</p></li>\n</ul>\n<p>W naszej aplikacji ankietowej będziemy mieć następujące cztery widoki:</p>\n<ul class=\"simple\">\n<li><p>Strona „główna” pytań – wyświetla klika najnowszych pytań.</p></li>\n<li><p>Strona „szczegółów” pytania – wyświetla treść pytania, bez wyników, ale z formularzem do głosowania.</p></li>\n<li><p>Strona „wyników” pytania – wyświetla wyniki dla wybranego pytania.</p></li>\n<li><p>Akcja głosowania – obsługuje głosowanie na konkretny wybór w wybranym pytaniu.</p></li>\n</ul>\n<p>W Django strony i inna treść są dostarczane przez widoki. Każdy widok jest reprezentowany przez funkcję Pythona (lub metodę, w przypadku widoków opartych na klasach). Django wybierze widok sprawdzając URL, który jest zażądany (aby być dokładnym, część URL-a po nazwie domeny).</p>\n<p>Teraz w swoim czasie w Internecie można natknąć się na takie piękności jak <code class=\"docutils literal notranslate\">ME2/Sites/dirmod.htm?sid=&amp;type=gen&amp;mod=Core+Pages&amp;gid=A6CD4967199A42D9B65B1B</code>. Ucieszysz się wiedząc, że Django pozwala nam na znacznie bardziej eleganckie <em>wzorce adresów URL</em> niż ten.</p>\n<p>Wzorzec URL jest ogólną formą URL-a – na przykład: <code class=\"docutils literal notranslate\">/newsarchive/&lt;year&gt;/&lt;month&gt;/</code>.</p>\n<p>Aby przejść z URL-a do widoku, Django używa czegoś, co znane jest jako «URLconfs». URLconf mapuje wzorce URL na widoki.</p>\n<p>Ten tutorial zawiera podstawowe instrukcje użytkowania URLconfów. Możesz przejść do <a class=\"reference internal\" href=\"/pl/6.1/topics/http/urls/\"><span class=\"doc\">URL dispatcher</span></a> po więcej informacji.</p>\n</section>\n<section id=\"writing-more-views\">\n<h2>Pisanie kolejnych widoków<a class=\"heading-anchor\" href=\"#writing-more-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Teraz dodajmy kilka więcej widoków do <code class=\"docutils literal notranslate\">polls/views.py</code>. Te widoki są nieco inne, bo biorą argument:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/views.py</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=\"k\">def</span> <span class=\"nf\">detail</span><span class=\"p\">(</span>request<span class=\"p\">,</span> question_id<span class=\"p\">):</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;re looking at question </span><span class=\"si\">%s</span><span class=\"s2\">.&quot;</span> <span class=\"o\">%</span> question_id<span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">results</span><span class=\"p\">(</span>request<span class=\"p\">,</span> question_id<span class=\"p\">):</span>\n    response <span class=\"o\">=</span> <span class=\"s2\">&quot;You&#39;re looking at the results of question </span><span class=\"si\">%s</span><span class=\"s2\">.&quot;</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>response <span class=\"o\">%</span> question_id<span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">vote</span><span class=\"p\">(</span>request<span class=\"p\">,</span> question_id<span class=\"p\">):</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;re voting on question </span><span class=\"si\">%s</span><span class=\"s2\">.&quot;</span> <span class=\"o\">%</span> question_id<span class=\"p\">)</span>\n</code></pre></figure>\n<p>Podłącz te nowe widoki do modułu <code class=\"docutils literal notranslate\">polls.urls</code> dodając następujące wywołania <a class=\"reference internal\" href=\"/pl/6.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\">path()</code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/urls.py</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=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">.</span> <span class=\"kn\">import</span> views\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ex: /polls/</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>index<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n    <span class=\"c1\"># ex: /polls/5/</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>detail<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n    <span class=\"c1\"># ex: /polls/5/results/</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/results/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>results<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;results&quot;</span><span class=\"p\">),</span>\n    <span class=\"c1\"># ex: /polls/5/vote/</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/vote/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>vote<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;vote&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Take a look in your browser, at „/polls/34/”. It’ll run the <code class=\"docutils literal notranslate\">detail()</code>\nfunction and display whatever ID you provide in the URL. Try\n„/polls/34/results/” and „/polls/34/vote/” too – these will display the\nplaceholder results and voting pages.</p>\n<p>Kiedy ktoś żąda strony z twojej witryny – powiedzmy „/polls/34/”, Django załaduje moduł <code class=\"docutils literal notranslate\">mysite.urls</code> Pythona, ponieważ jest wskazany przez ustawienie <a class=\"reference internal\" href=\"/pl/6.1/ref/settings/#std-setting-ROOT_URLCONF\"><code class=\"xref std std-setting docutils literal notranslate\">ROOT_URLCONF</code></a>. Odnajduje on zmienną nazwaną <code class=\"docutils literal notranslate\">urlpatterns</code> i trawersuje po kolei wzorce. Po odnalezieniu dopasowania w <code class=\"docutils literal notranslate\">'polls/'</code>, odcina pasujący tekst (<code class=\"docutils literal notranslate\">„polls/”</code>) i wysyła pozostały tekst – <code class=\"docutils literal notranslate\">„34/”</code> – do URLconfa «polls.urls» do dalszego przetwarzania. Tam dopasowuje go do <code class=\"docutils literal notranslate\">'&lt;int:question_id&gt;/'</code>, co kończy się wywołaniem widoku <code class=\"docutils literal notranslate\">detail()</code> w ten sposób:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"go\">detail(request=&lt;HttpRequest object&gt;, question_id=34)</span>\n</code></pre></div>\n<p>Część <code class=\"docutils literal notranslate\">question_id=34</code> pochodzi z <code class=\"docutils literal notranslate\">&lt;int:question_id&gt;</code>. Użycie nawiasów trójkątnych  „wyłapuje” część URL-a i wysyła ją jako argument do funkcji widoku. Część <code class=\"docutils literal notranslate\">:question_id&gt;</code> ciągu znaków określa nazwę, która zostanie użyta, aby zidentyfikować dopasowany wzorzec, a część <code class=\"docutils literal notranslate\">&lt;int:</code> jest konwerterem, który określa jakie wzorce powinny pasować do tej części ścieżki URL. Dwukropek (<code class=\"docutils literal notranslate\">:</code>) rozdziela nazwy konwertera i wzorca.</p>\n</section>\n<section id=\"write-views-that-actually-do-something\">\n<h2>Pisanie widoków, które faktycznie coś robią<a class=\"heading-anchor\" href=\"#write-views-that-actually-do-something\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Każdy widok jest odpowiedzialny za zrobienie jednej z dwóch rzeczy: zwrócenie obiektu <a class=\"reference internal\" href=\"/pl/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> zawierającego treść dla żądanej strony lub rzucenie wyjątku takiego jak <a class=\"reference internal\" href=\"/pl/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\">Http404</code></a>. Reszta zależy od ciebie.</p>\n<p>Twój widok może czytać rekordy z bazy danych lub nie. Może używać systemu szablonów takiego jak Django – lub innego systemu szablonów Python – lub nie. Może generować plik PDF, zwracać XML, tworzyć w locie plik ZIP, cokolwiek chcesz, używając dowolnych bibliotek Pythona, których chcesz.</p>\n<p>Wszystko, czego chce Django, to ten <a class=\"reference internal\" href=\"/pl/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a>. Lub wyjątek.</p>\n<p>Użyjmy własnego bazodanowego API Django, które omówiliśmy w <a class=\"reference internal\" href=\"/pl/6.1/intro/tutorial02/\"><span class=\"doc\">Tutorialu 2</span></a>, ponieważ jest wygodne. Tu jest próba w nowym widoku <code class=\"docutils literal notranslate\">index()</code>, która wyświetla ostatnie 5 pytań ankietowych w systemie, oddzielone przecinkami, według daty publikacji:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/views.py</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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\n\n<span class=\"k\">def</span> <span class=\"nf\">index</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    latest_question_list <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n    output <span class=\"o\">=</span> <span class=\"s2\">&quot;, &quot;</span><span class=\"o\">.</span>join<span class=\"p\">([</span>q<span class=\"o\">.</span>question_text <span class=\"k\">for</span> q <span class=\"ow\">in</span> latest_question_list<span class=\"p\">])</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n\n\n<span class=\"c1\"># Leave the rest of the views (detail, results, vote) unchanged</span>\n</code></pre></figure>\n<p>There’s a problem here, though: the page’s design is hardcoded in the view. If\nyou want to change the way the page looks, you’ll have to edit this Python\ncode. So let’s use Django’s template system to separate the design from Python\nby creating a template that the view can use.</p>\n<p>Najpierw stwórzmy katalog o nazwie <code class=\"docutils literal notranslate\">templates</code> w twoim katalogu <code class=\"docutils literal notranslate\">polls</code>. Django będzie tam szukał szablonów.</p>\n<p>Ustawienie <a class=\"reference internal\" href=\"/pl/6.1/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\">TEMPLATES</code></a> twojego projektu opisuje jak Django będzie ładował i renderował szablony. Domyślny plik ustawień konfiguruje backend <code class=\"docutils literal notranslate\">DjangoTemplates</code>, którego opcja <a class=\"reference internal\" href=\"/pl/6.1/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\">APP_DIRS</code></a> jest ustawiona na <code class=\"docutils literal notranslate\">True</code>. Według konwencji <code class=\"docutils literal notranslate\">DjangoTemplates</code> szuka podkatalogu „templates” w każdej z <a class=\"reference internal\" href=\"/pl/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>.</p>\n<p>W katalogu <code class=\"docutils literal notranslate\">templates</code>, który właśnie stworzyłeś, stwórz kolejny katalog o nazwie <code class=\"docutils literal notranslate\">polls</code> i w tym katalogu stwórz plik o nazwie <code class=\"docutils literal notranslate\">index.html</code>. Innymi słowy, twój szablon powinien być pod <code class=\"docutils literal notranslate\">polls/templates/polls/index.html</code>. Ponieważ loader szablonów <code class=\"docutils literal notranslate\">app_directories</code> działa jak opisano powyżej, możesz odwoływać się do tego szablonu w Django <code class=\"docutils literal notranslate\">polls/index.html</code>.</p>\n<aside class=\"admonition-template-namespacing admonition\" role=\"note\">\n<p class=\"admonition-title\">Przestrzeń nazw szablonu</p>\n<p>Teraz <em>moglibyśmy</em> poradzić sobie umieszczając nasze szablony bezpośrednio w <code class=\"docutils literal notranslate\">polls/templates</code> (zamiast tworzyć kolejny podkatalog <code class=\"docutils literal notranslate\">polls</code>), ale w rzeczywistości byłoby to złym pomysłem. Django wybierze pierwszy szablon, którego nazwa się zgadza i jeśli miałbyś szablon o takiej samej nazwie w <em>innej</em> aplikacji, Django nie byłoby w stanie ich odróżnić. Musimy być w stanie wskazać Django odpowiedni szablon i najlepszym sposobem, aby to zapewnić jest <em>znamespace’owanie</em> ich. To znaczy umieszczenie tych szablonów w <em>innym</em> katalogu nazwanym dla samej aplikacji.</p>\n</aside>\n<p>Umieść następujący kod w tym szablonie:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/templates/polls/index.html</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\">if</span> <span class=\"nv\">latest_question_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">question</span> <span class=\"k\">in</span> <span class=\"nv\">latest_question_list</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/polls/</span><span class=\"cp\">{{</span> <span class=\"nv\">question.id</span> <span class=\"cp\">}}</span><span class=\"s\">/&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>No polls are available.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Informacja</p>\n<p>Aby skrócić tutorial, wszystkie przykłady szablonów używają niepełnego HTML-a. W swoich projektach powinieneś używać <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started#anatomy_of_an_html_document\">pełnych dokumentów HTML</a>.</p>\n</aside>\n<p>Teraz zaktualizujmy nasz widok <code class=\"docutils literal notranslate\">index</code> w <code class=\"docutils literal notranslate\">polls/views.py</code>, aby używał szablonu:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/views.py</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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.template</span> <span class=\"kn\">import</span> loader\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\n\n<span class=\"k\">def</span> <span class=\"nf\">index</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    latest_question_list <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n    template <span class=\"o\">=</span> loader<span class=\"o\">.</span>get_template<span class=\"p\">(</span><span class=\"s2\">&quot;polls/index.html&quot;</span><span class=\"p\">)</span>\n    context <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;latest_question_list&quot;</span><span class=\"p\">:</span> latest_question_list<span class=\"p\">}</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>template<span class=\"o\">.</span>render<span class=\"p\">(</span>context<span class=\"p\">,</span> request<span class=\"p\">))</span>\n</code></pre></figure>\n<p>Ten kod ładuje szablon o nazwie <code class=\"docutils literal notranslate\">polls/index.html</code> i przekazuje mu kontekts. Kontekst jest słownikiem mapującym nazwy zmiennych szablonu do obiektów Pythona.</p>\n<p>Załaduj stronę kierując swoją przeglądarkę na „/polls/”. Powinnieneś zobaczyć wypunktowaną listę zawierającą pytanie „What’s up” z <a class=\"reference internal\" href=\"/pl/6.1/intro/tutorial02/\"><span class=\"doc\">Tutoriala 2</span></a>. Link kieruje do strony szczegółów pytania.</p>\n<section id=\"a-shortcut-render\">\n<h3>Skrót: <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#django.shortcuts.render\" title=\"django.shortcuts.render\"><code class=\"xref py py-func docutils literal notranslate\">render()</code></a><a class=\"heading-anchor\" href=\"#a-shortcut-render\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To popularny idiom do ładowania szablonu, wypełniania kontekstu i zwracania obiektu <a class=\"reference internal\" href=\"/pl/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> z wynikiem wyrenderowanego szablonu. Djano daje skrót. Tutaj jest pełen widok <code class=\"docutils literal notranslate\">index()</code>, napisany na nowo:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/views.py</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=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\n\n<span class=\"k\">def</span> <span class=\"nf\">index</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    latest_question_list <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n    context <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;latest_question_list&quot;</span><span class=\"p\">:</span> latest_question_list<span class=\"p\">}</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;polls/index.html&quot;</span><span class=\"p\">,</span> context<span class=\"p\">)</span>\n</code></pre></figure>\n<p>Zwróć uwagę, że kiedy zrobiliśmy to w tych wszystkich widokach, nie potrzebujemy już importować <a class=\"reference internal\" href=\"/pl/6.1/topics/templates/#module-django.template.loader\" title=\"django.template.loader\"><code class=\"xref py py-mod docutils literal notranslate\">loader</code></a> i <a class=\"reference internal\" href=\"/pl/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> (będziesz chciał zatrzymać <code class=\"docutils literal notranslate\">HttpResponse</code> jeśli wciąż masz zaczątki metod dla <code class=\"docutils literal notranslate\">detail</code>, <code class=\"docutils literal notranslate\">results</code> i <code class=\"docutils literal notranslate\">vote</code>).</p>\n<p>Funkcja <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#django.shortcuts.render\" title=\"django.shortcuts.render\"><code class=\"xref py py-func docutils literal notranslate\">render()</code></a> bierze obiekt request jako swój pierwszy argument, nazwę szablonu jako drugi argument i słownik jako swój opcjonalny trzeci argument. Zwraca obiekt <a class=\"reference internal\" href=\"/pl/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> danego szablonu wyrenderowany z danym kontekstem.</p>\n</section>\n</section>\n<section id=\"raising-a-404-error\">\n<h2>Zgłaszanie błędu 404<a class=\"heading-anchor\" href=\"#raising-a-404-error\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Teraz zawalczmy z widokiem szczegółów pytania – strony, która wyświetla treść pytania dla danej ankiety. Tutaj jest widok:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/views.py</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=\"nn\">django.http</span> <span class=\"kn\">import</span> Http404\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\n\n<span class=\"c1\"># ...</span>\n<span class=\"k\">def</span> <span class=\"nf\">detail</span><span class=\"p\">(</span>request<span class=\"p\">,</span> question_id<span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        question <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span>question_id<span class=\"p\">)</span>\n    <span class=\"k\">except</span> Question<span class=\"o\">.</span>DoesNotExist<span class=\"p\">:</span>\n        <span class=\"k\">raise</span> Http404<span class=\"p\">(</span><span class=\"s2\">&quot;Question does not exist&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;polls/detail.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;question&quot;</span><span class=\"p\">:</span> question<span class=\"p\">})</span>\n</code></pre></figure>\n<p>Nowy koncept tutaj: Widok zgłasza wyjątek <a class=\"reference internal\" href=\"/pl/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\">Http404</code></a> jeśli pytanie o żądanym ID nie istnieje.</p>\n<p>Omówimy trochę później co mógłbyś umieścić w tym szablonie <code class=\"docutils literal notranslate\">polls/detail.html</code>, ale jeśli chcesz, aby powyższy przykład szybko zaczął działać, plik zawierający tylko:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/templates/polls/detail.html</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=\"nv\">question</span> <span class=\"cp\">}}</span>\n</code></pre></figure>\n<p>pomoże ci wystartować na teraz.</p>\n<section id=\"a-shortcut-get-object-or-404\">\n<h3>Skrót: <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\">get_object_or_404()</code></a><a class=\"heading-anchor\" href=\"#a-shortcut-get-object-or-404\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To popularny idiom do używania <a class=\"reference internal\" href=\"/pl/6.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> i zgłaszania <a class=\"reference internal\" href=\"/pl/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\">Http404</code></a> jeśli obiekt nie istnieje. Django daje skrót. Tutaj jest widok <code class=\"docutils literal notranslate\">detail()</code> przepisany:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/views.py</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=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> get_object_or_404<span class=\"p\">,</span> render\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\n\n<span class=\"c1\"># ...</span>\n<span class=\"k\">def</span> <span class=\"nf\">detail</span><span class=\"p\">(</span>request<span class=\"p\">,</span> question_id<span class=\"p\">):</span>\n    question <span class=\"o\">=</span> get_object_or_404<span class=\"p\">(</span>Question<span class=\"p\">,</span> pk<span class=\"o\">=</span>question_id<span class=\"p\">)</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;polls/detail.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;question&quot;</span><span class=\"p\">:</span> question<span class=\"p\">})</span>\n</code></pre></figure>\n<p>Funkcja <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\">get_object_or_404()</code></a> bierze model Django jako swój pierwszy argument i wyznaczoną wcześniej liczbę arguementów nazwanych, które przekazuje do funkcji <a class=\"reference internal\" href=\"/pl/6.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> menadżera modelu. Zgłasza <a class=\"reference internal\" href=\"/pl/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\">Http404</code></a> jeśli obiekt nie istnieje.</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filozofia</p>\n<p>Dlaczego używamy funkcji pomocniczej <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\">get_object_or_404()</code></a> zamiast automatycznie wyłapywać wyjątki <a class=\"reference internal\" href=\"/pl/6.1/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">ObjectDoesNotExist</code></a> na wyższym poziomie lub powodując, że API modelu będzie zgłaszać <a class=\"reference internal\" href=\"/pl/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\">Http404</code></a> zamiast <a class=\"reference internal\" href=\"/pl/6.1/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">ObjectDoesNotExist</code></a>?</p>\n<p>Ponieważ to związałoby warstwę modelu z warstwą widoku. Jednym z najważniejszych celów projektowych Django było utrzymywania luźnych więzów. Trochę kontrolowanego wiązania jest wprowadzone w module <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#module-django.shortcuts\" title=\"django.shortcuts: Convenience shortcuts that span multiple levels of Django's MVC stack.\"><code class=\"xref py py-mod docutils literal notranslate\">django.shortcuts</code></a>.</p>\n</aside>\n<p>Jest też funkcja <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#django.shortcuts.get_list_or_404\" title=\"django.shortcuts.get_list_or_404\"><code class=\"xref py py-func docutils literal notranslate\">get_list_or_404()</code></a>, która działa tak samo jak <a class=\"reference internal\" href=\"/pl/6.1/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\">get_object_or_404()</code></a> – z wyjątkiem używania <a class=\"reference internal\" href=\"/pl/6.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a> zamiast <a class=\"reference internal\" href=\"/pl/6.1/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a>. Zgłasza wyjątek <a class=\"reference internal\" href=\"/pl/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\">Http404</code></a> gdy lista jest pusta.</p>\n</section>\n</section>\n<section id=\"use-the-template-system\">\n<h2>Użyj systemu szablonów<a class=\"heading-anchor\" href=\"#use-the-template-system\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Wracamy do widoku <code class=\"docutils literal notranslate\">detail()</code> naszej aplikacji ankietowej. Mając zmienną kontekstową <code class=\"docutils literal notranslate\">question</code>, tak mógłby wyglądać nasz szablon <code class=\"docutils literal notranslate\">polls/detail.html</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/templates/polls/detail.html</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=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">choice</span> <span class=\"k\">in</span> <span class=\"nv\">question.choice_set.all</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">choice.choice_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>System szablonów używa składni kropkowego lookupu, aby dostać się do atrybutów zmiennej. W przykładzie <code class=\"docutils literal notranslate\">{{ question.question_text }}</code>, najpierw Django robi słownikowy lookup na obiekcie <code class=\"docutils literal notranslate\">question</code>. Gdy to się nie uda, próbuje atrybutowego lookupu – który w tym przypadku działa. Gdyby atrybutowy lookup się nie powiódł, spróbowałoby lookupu przez indeks listy.</p>\n<p>Wywoływanie metod dzieje się w pętli <a class=\"reference internal\" href=\"/pl/6.1/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\">{% for %}</code></a>: <code class=\"docutils literal notranslate\">question.choice_set.all</code> jest interpretowane jako kod Pythona <code class=\"docutils literal notranslate\">question.choice_set.all()</code>, który zwraca iterator obiektów <code class=\"docutils literal notranslate\">Choice</code> i jest odpowiedni do użycia w tagu <a class=\"reference internal\" href=\"/pl/6.1/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\">{% for %}</code></a>.</p>\n<p>Zobacz <a class=\"reference internal\" href=\"/pl/6.1/topics/templates/\"><span class=\"doc\">przewodnik po szablonach</span></a> po więcej informacji na temat szablonów.</p>\n</section>\n<section id=\"removing-hardcoded-urls-in-templates\">\n<h2>Usuwanie wstawionych na sztywno URL-i z szablonów<a class=\"heading-anchor\" href=\"#removing-hardcoded-urls-in-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pamiętasz, kiedy wpisaliśmy link do pytania w szablonie <code class=\"docutils literal notranslate\">polls/index.html</code>, link był częściowo wpisany na sztywno, w ten sposób:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/polls/</span><span class=\"cp\">{{</span> <span class=\"nv\">question.id</span> <span class=\"cp\">}}</span><span class=\"s\">/&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>The problem with this hardcoded, tightly-coupled approach is that it becomes\nchallenging to change URLs on projects with a lot of templates. However, since\nyou defined the <code class=\"docutils literal notranslate\">name</code> argument in the <a class=\"reference internal\" href=\"/pl/6.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\">path()</code></a> functions in\nthe <code class=\"docutils literal notranslate\">polls.urls</code> module, you can remove a reliance on specific URL paths\ndefined in your url configurations by using the <code class=\"docutils literal notranslate\">{% url %}</code> template tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;detail&#39;</span> <span class=\"nv\">question.id</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Działa to przez sprawdzenie definicji URL-a według specyfikacji w module <code class=\"docutils literal notranslate\">polls.urls</code>. Możesz zobaczyć poniżej, gdzie dokładnie nazwa «detail» jest zdefiniowana w URL-u:</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=\"o\">...</span>\n<span class=\"c1\"># the &#39;name&#39; value as called by the {% url %} template tag</span>\npath<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>detail<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n<span class=\"o\">...</span>\n</code></pre></div>\n<p>Jeśli chcesz zmienić URL widoku szczegółów ankiety na jakiś inny, na przykład na coś w stylu <code class=\"docutils literal notranslate\">polls/specifics/12/</code>, zamiast robić to w szablonie (lub szablonach), zmieniłbyś to w <code class=\"docutils literal notranslate\">polls/urls.py</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=\"o\">...</span>\n<span class=\"c1\"># added the word &#39;specifics&#39;</span>\npath<span class=\"p\">(</span><span class=\"s2\">&quot;specifics/&lt;int:question_id&gt;/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>detail<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n<span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"namespacing-url-names\">\n<h2>Przestrzenie nazw dla nazw URL-i<a class=\"heading-anchor\" href=\"#namespacing-url-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Projekt tutorialowy ma tylko jedną aplikację, <code class=\"docutils literal notranslate\">polls</code>. W prawdziwych projektach Django może być pięć, dziesięć, dwadzieścia lub więcej aplikacji. Jak Django odróżnia nazwy URL pomiędzy nimi? Na przykład aplikacja <code class=\"docutils literal notranslate\">polls</code> ma widok <code class=\"docutils literal notranslate\">detail</code> i tak samo mogłaby mieć aplikacja blogowa w tym samym projekcie. Jak zrobić, aby Django wiedziało, której aplikacji widok stworzyć dla urla w przypadku użycia taga <code class=\"docutils literal notranslate\">{% url %}</code>?</p>\n<p>Odpowiedzią jest dodanie przestrzeni nazw do twojego URLconfa. W pliku <code class=\"docutils literal notranslate\">polls/urls.py</code> dodaj <code class=\"docutils literal notranslate\">app_name</code>, aby ustawić przestrzeń nazw aplikacji:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/urls.py</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=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">.</span> <span class=\"kn\">import</span> views\n\napp_name <span class=\"o\">=</span> <span class=\"s2\">&quot;polls&quot;</span>\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>index<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>detail<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/results/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>results<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;results&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/vote/&quot;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>vote<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;vote&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Teraz zmień swój szablon <code class=\"docutils literal notranslate\">polls/index.html</code> z:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/templates/polls/index.html</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=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;detail&#39;</span> <span class=\"nv\">question.id</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>aby wskazywał na widok szczegółów w przestrzeni nazw:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/templates/polls/index.html</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=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;polls:detail&#39;</span> <span class=\"nv\">question.id</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Jeśli czujesz się dobrze z pisaniem widoków, przeczytaj <a class=\"reference internal\" href=\"/pl/6.1/intro/tutorial04/\"><span class=\"doc\">część czwartą tego tutoriala</span></a>, aby dowiedzieć się podstaw o przetwarzaniu formularzy i widokach generycznych.</p>\n</section>","rootId":"writing-your-first-django-app-part-3","toc":[{"title":"Przegląd","anchor":"overview","children":[]},{"title":"Pisanie kolejnych widoków","anchor":"writing-more-views","children":[]},{"title":"Pisanie widoków, które faktycznie coś robią","anchor":"write-views-that-actually-do-something","children":[{"title":"Skrót: render()","anchor":"a-shortcut-render","children":[]}]},{"title":"Zgłaszanie błędu 404","anchor":"raising-a-404-error","children":[{"title":"Skrót: get_object_or_404()","anchor":"a-shortcut-get-object-or-404","children":[]}]},{"title":"Użyj systemu szablonów","anchor":"use-the-template-system","children":[]},{"title":"Usuwanie wstawionych na sztywno URL-i z szablonów","anchor":"removing-hardcoded-urls-in-templates","children":[]},{"title":"Przestrzenie nazw dla nazw URL-i","anchor":"namespacing-url-names","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Pierwsze kroki","url":"/pl/6.1/intro/"}],"prev":{"docname":"intro/tutorial02","title":"Pisanie pierwszej aplikacji Django, część 2.","url":"/pl/6.1/intro/tutorial02/"},"next":{"docname":"intro/tutorial04","title":"Pisanie pierwszej aplikacji Django, część 4.","url":"/pl/6.1/intro/tutorial04/"},"formats":{"html":"/pl/6.1/intro/tutorial03/","markdown":"/pl/6.1/intro/tutorial03.md","json":"/pl/6.1/intro/tutorial03.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/intro/tutorial03.txt","official":"https://docs.djangoproject.com/pl/6.1/intro/tutorial03/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}