{"title":"Pisanie pierwszej poprawki do Django","version":"1.11","locale":"pl","docname":"intro/contributing","url":"/pl/1.11/intro/contributing/","canonical":"https://djangodocs.dev/pl/1.11/intro/contributing/","summary":"Wprowadzenie Link to this heading # Jesteś zainteresowany odwdzięczeniem się odrobinę społeczności? Może znalazłeś błąd w Django, który chciałbyś, by był…","html":"<h1>Pisanie pierwszej poprawki do Django<a class=\"heading-anchor\" href=\"#writing-your-first-patch-for-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Wprowadzenie<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Jesteś zainteresowany odwdzięczeniem się odrobinę społeczności? Może znalazłeś błąd w Django, który chciałbyś, by był rozwiązany, lub jest jakaś mała funkcjonalność, którą chciałbyś, by była dodana.</p>\n<p>Pomoc w rozwoju Django jest najlepszym sposobem na rozwiązanie napotkanych przez Ciebie problemów. Na początku może to wydawać się zniechęcające, ale tak naprawdę jest całkiem proste. Przeprowadzimy Cię przez cały proces na przykładzie, abyś mógł się nauczyć tego w praktyce.</p>\n<section id=\"who-s-this-tutorial-for\">\n<h3>Dla kogo jest ten tutorial?<a class=\"heading-anchor\" href=\"#who-s-this-tutorial-for\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Zobacz także</p>\n<p>Jeśli szukasz informacji jak zgłaszać poprawki, obejrzyj dokumentację <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">Submitting patches</span></a>.</p>\n</aside>\n<p>Na potrzeby tego tutorialu oczekujemy posiadanie co najmniej podstawowego rozumienia, jak działa Django. To znaczy, że czytelnik powinien być już obeznany z istniejącymi tutorialami na temat <a class=\"reference internal\" href=\"/pl/1.11/intro/tutorial01/\"><span class=\"doc\">pisania jego pierwszej aplikacji Django</span></a>. Dodatkowo, powinien dobrze rozumieć samego Pythona. W przypadku jeśli tak nie jest, <a class=\"reference external\" href=\"http://www.diveintopython3.net/\">Dive Into Python</a> jest fantastyczną (i darmową) książką online dla początkujących programistów Pythona.</p>\n<p>Ci z was, którzy nie są zaznajomieni z systemami kontroli wersji i Trakiem przekonają się, że w tym poradniku i jego odnośnikach znajdą wystarczająco informacji, aby zacząć pracę. Pomimo tego, prawdopodobnie będziecie potrzebować przeczytać nieco więcej o tych różnych narzędziach, jeśli planujecie regularnie współtworzyć Django.</p>\n<p>Celem tego poradnika w głównej mierze jest wytłumaczenie wszystkiego najdokładniej jak to możliwe, aby mógł być on używany przez szerokie grono odbiorców.</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 samouczka, prosimy napisz wiadomość do <a class=\"reference internal\" href=\"/pl/1.11/internals/mailing-lists/#django-developers-mailing-list\"><span class=\"std std-ref\">django-developers</span></a> lub wpadnij na <a class=\"reference external\" href=\"irc://irc.freenode.net/django-dev\">#django-dev na irc.freenode.net</a>, aby czatować z innymi użytkownikami Django, którzy mogą być w stanie udzielić ci pomocy.</p>\n</aside>\n</section>\n<section id=\"what-does-this-tutorial-cover\">\n<h3>Co zawiera ten przewodnik?<a class=\"heading-anchor\" href=\"#what-does-this-tutorial-cover\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Przeprowadzimy cię przez pierwsze tworzenie poprawki do Django. Pod koniec tego tutoriala, powinieneś(nnaś) rozumieć podstawy zarówno narzędzi jak i wykorzystanych procesów. W szczególności poruszymy następujące tematy:</p>\n<ul class=\"simple\">\n<li><p>Instalacja Gita.</p></li>\n<li><p>Jak pobrać rozwojową wersję Django.</p></li>\n<li><p>Uruchamianie zestawu testów Django.</p></li>\n<li><p>Pisanie testu dla twojej poprawki.</p></li>\n<li><p>Pisanie kodu dla twojej poprawki.</p></li>\n<li><p>Testowanie twojej poprawki.</p></li>\n<li><p>Wysyłanie prośby o pull.</p></li>\n<li><p>Gdzie szukać więcej informacji.</p></li>\n</ul>\n<p>Kiedy tutorial jest już za tobą, możesz przejrzeć resztę <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/\"><span class=\"doc\">Django’s documentation on contributing</span></a>. Zawiera ona wiele dobrych informacji i jest lekturą obowiązkową dla każdego, kto chciałby zostać stałym współtwórcą Django. Jeśli masz pytania, tam prawdopodobnie są odpowiedzi.</p>\n<aside class=\"admonition-python-3-required admonition\">\n<p class=\"admonition-title\">Wymagany Python 3!</p>\n<p>Ten tutorial zakłada, że używasz Pythona 3. Pobierz najnowszą wersję ze <a class=\"reference external\" href=\"https://www.python.org/downloads/\">strony pobierania Pythona</a> lub za pomocą menadżera pakietów twojego systemu operacyjnego.</p>\n</aside>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Dla użytkowników Windows</p>\n<p>Instalując Pythona na Windowsie upewnij się, że zaznaczyłeś opcję „Add python.exe to Path”, aby zawsze był dostępny z linii komend.</p>\n</aside>\n</section>\n</section>\n<section id=\"code-of-conduct\">\n<h2>Kodeks Postępowania<a class=\"heading-anchor\" href=\"#code-of-conduct\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Jako współtwórca możesz pomóc nam utrzymać społeczność Django otwartą i zintegrowaną. Przeczytaj i postępuj zgodnie z naszym <a class=\"reference external\" href=\"https://www.djangoproject.com/conduct/\">Kodeksem Postępowania</a>.</p>\n</section>\n<section id=\"installing-git\">\n<h2>Instalacja Git’a<a class=\"heading-anchor\" href=\"#installing-git\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Do tego poradnika będziesz potrzebował mieć zainstalowanego Gita, aby pobrać aktualną wersję rozwojową Django i wygenerować pliki poprawek dla zmian, które dokonasz.</p>\n<p>Aby sprawdzić, czy posiadasz zainstalowanego Gita, wpisz <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span></code> w wiersz poleceń. Jeśli otrzymasz informację, że taka komenda nie została znaleziona, będziesz musiał go pobrać i zainstalować. Zobacz <a class=\"reference external\" href=\"https://git-scm.com/download\">stronę pobierania Gita</a>.</p>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Dla użytkowników Windows</p>\n<p>Podczas instalacji Gita na Windowsie, zalecane jest, abyś wybrał opcję „Git Bash”, dzięki której Git uruchamia się we własnej powłoce. Ten poradnik zakłada, że tak właśnie go zainstalowałeś.</p>\n</aside>\n<p>Jeśli nie jesteś zaznajomiony z Gitem, możesz zawsze znaleźć więcej informacji na temat komend (kiedy Git jest zainstalowany) wpisując <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">help</span></code> w wiersz poleceń.</p>\n</section>\n<section id=\"getting-a-copy-of-django-s-development-version\">\n<h2>Uzyskiwanie kopii wersji rozwojowej Django<a class=\"heading-anchor\" href=\"#getting-a-copy-of-django-s-development-version\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pierwszym krokiem do współtworzenia Django jest uzyskanie kopii kodu źródłowego. Najpierw <a class=\"reference external\" href=\"https://github.com/django/django/fork\">rozwidlij Django na GitHubie</a>. Następnie użyj polecenia <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> w linii poleceń, aby przejść do katalogu, gdzie będziesz chciał trzymać swoją lokalną kopię Django.</p>\n<p>Pobierz repozytorium kodu źródłowego Django używając poniższego polecenia:</p>\n<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>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>git@github.com:YourGitHubName/django.git\n</code></pre></div>\n<p>Kiedy już masz lokalną kopię Django, możesz go zainstalować tak jak zainstalowałbyś dowolny pakiet za pomocą <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code>-a. Najwygodniejszy sposób, aby to zrobić jest użyć <em>virtual environment</em> (inaczej virtualenv) które jest funkcjonalnością wbudowaną w Pythona, która pozwala ci trzymać oddzielny katalog zainstalowanych pakietów dla każdego z twoich projektów, aby nie wchodziły ze sobą w konflikt.</p>\n<p>Dobrą praktyką jest przechowywanie wszystkich swoich virtualenv w jednym miejscu, na przykład w <code class=\"docutils literal notranslate\"><span class=\"pre\">.virtualenvs/</span></code> w Twoim katalogu domowym. Utwórz ten katalog jeśli jeszcze nie istnieje:</p>\n<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>mkdir<span class=\"w\"> </span>~/.virtualenvs\n</code></pre></div>\n<p>Następnie utwórz nowe środowisko wirtualne uruchamiając:</p>\n<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>python3<span class=\"w\"> </span>-m<span class=\"w\"> </span>venv<span class=\"w\"> </span>~/.virtualenvs/djangodev\n</code></pre></div>\n<p>Ścieżką jest miejsce gdzie nowe środowisko zostanie zapisane na Twoim komputerze:</p>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Dla użytkowników Windows</p>\n<p>Używanie wbudowanego modułu <code class=\"docutils literal notranslate\"><span class=\"pre\">venv</span></code> nie zadziała jeśli używasz shella Git Bash na Windowsie od czasu, gdy skrypty aktywacyjne są stworzone jedynie dla shella systemowego (<code class=\"docutils literal notranslate\"><span class=\"pre\">.bat</span></code>) i PowerShell (<code class=\"docutils literal notranslate\"><span class=\"pre\">.ps1</span></code>). Zamiast tego użyj pakietu <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code></p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</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=\"None code\"><code>$ pip install virtualenv\n$ virtualenv ~/.virtualenvs/djangodev\n</code></pre></div>\n</aside>\n<aside class=\"admonition-for-ubuntu-users admonition\">\n<p class=\"admonition-title\">Dla użytkowników Ubuntu</p>\n<p>Na niektórych wersjach Ubuntu powyższa komenda może nie zadziałać. W takim przypadku użyj w zamian pakietu <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code>, upewniając się przed tym, że posiadasz <code class=\"docutils literal notranslate\"><span class=\"pre\">pip3</span></code>:</p>\n<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>sudo<span class=\"w\"> </span>apt-get<span class=\"w\"> </span>install<span class=\"w\"> </span>python3-pip\n<span class=\"gp\">$ </span><span class=\"c1\"># Prefix the next command with sudo if it gives a permission denied error</span>\n<span class=\"gp\">$ </span>pip3<span class=\"w\"> </span>install<span class=\"w\"> </span>virtualenv\n<span class=\"gp\">$ </span>virtualenv<span class=\"w\"> </span>--python<span class=\"o\">=</span><span class=\"sb\">`</span>which<span class=\"w\"> </span>python3<span class=\"sb\">`</span><span class=\"w\"> </span>~/.virtualenvs/djangodev\n</code></pre></div>\n</aside>\n<p>Ostatnim krokiem w procesie konfigurowania Twojego środowiska wirtualnego jest jego aktywacja:</p>\n<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><span class=\"nb\">source</span><span class=\"w\"> </span>~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<p>Jeśli komenda <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> nie jest dostępna, możesz spróbować zamiast niej użyć kropki:</p>\n<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>.<span class=\"w\"> </span>~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Dla użytkowników Windows</p>\n<p>Aby aktywować swoje środowisko wirtualne w systemie Windows, uruchom:</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</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=\"None code\"><code>$ source ~/virtualenvs/djangodev/Scripts/activate\n</code></pre></div>\n</aside>\n<p>Musisz aktywować swoje środowisko wirtualne zawsze, kiedy otwierasz nowe okno terminala. <a class=\"reference external\" href=\"https://virtualenvwrapper.readthedocs.io/en/latest/\">virtualenvwrapper</a> jest przydatnym narzędziem ułatwiającym ten proces.</p>\n<p>Wszystko, co zainstalujesz poprzez <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code> od teraz będzie instalowane w Twoim nowym środowisku wirtualnym, odizolowane od innych środowisk i pakietów w systemie. Ponadto nazwa aktualnie aktywowanego środowiska wirtualnego jest wyświetlana w wierszu poleceń, aby ułatwić Ci śledzenie, którego z nich używasz. Śmiało zainstaluj wcześniej sklonowaną kopię Django:</p>\n<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>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-e<span class=\"w\"> </span>/path/to/your/local/clone/django/\n</code></pre></div>\n<p>Zainstalowana wersja Django od teraz wskazuje na Twoją lokalną kopię. Dzięki temu natychmiastowo będziesz widział wszelkie zmiany, których dokonasz co jest bardzo przydatne podczas pisania Twojej pierwszej poprawki.</p>\n</section>\n<section id=\"rolling-back-to-a-previous-revision-of-django\">\n<h2>Powracanie do poprzedniej wersji Django<a class=\"heading-anchor\" href=\"#rolling-back-to-a-previous-revision-of-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Na potrzeby tutoriala, użyjemy zgłoszenia <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> jako studium przypadku, więc przewiniemy historię wersji Django w git’cie do momentu zanim dodana została poprawka tego zgłoszenia. To pozwoli nam przejść wszystkie kroki składające się na napisanie tej poprawki od podstaw, włączając uruchomienie pakietu testów Django.</p>\n<p><strong>Zwróć uwagę, że mimo iż będziemy używać starszej wersji trunka Django na potrzeby poniższego tutoriala, powinieneś zawsze używać bieżącej wersji deweloperskiej Django pracując nad poprawką do zgłoszenia!</strong></p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Informacja</p>\n<p>Poprawka do tego zgłoszenia została napisana przez Pawła Marczewskiego i została zastosowana w Django jako <a class=\"reference external\" href=\"https://github.com/django/django/commit/4df7e8483b2679fc1cba3410f08960bac6f51115\">commit 4df7e8483b2679fc1cba3410f08960bac6f51115</a>. Stąd użyjemy wersji Django bezpośrednio ją poprzedzającej, <a class=\"reference external\" href=\"https://github.com/django/django/commit/4ccfc4439a7add24f8db4ef3960d02ef8ae09887\">commit 4ccfc4439a7add24f8db4ef3960d02ef8ae09887</a>.</p>\n</aside>\n<p>Wejdź do głównego katalogu Django (to ten, który zawiera <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">docs</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHORS</span></code> itd.). Następnie możesz zcheckoutować starszą wersję Django, którą będziemy używać w poniższym tutorialu:</p>\n<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>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>4ccfc4439a7add24f8db4ef3960d02ef8ae09887\n</code></pre></div>\n</section>\n<section id=\"running-django-s-test-suite-for-the-first-time\">\n<h2>Uruchomienie zestawu testów Django po raz pierwszy<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-first-time\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dając wkład w kod Django, bardzo ważne jest, aby twoje zmiany nie wprowadzały błędów w innych obszarach Django. Jednym ze sposobów, aby sprawdzić, czy Django nadal działa po twoich zmianach jest uruchomienie zestawu testów Django. Jeśli wszystkie testy nadal przechodzą, wtedy masz podstawy, by sądzić, że twoje zmiany nie popsuły kompletnie Django. Jeśli nigdy wcześniej nie uruchamiałeś zestawu testów Django, dobrym pomysłem jest uprzednio uruchomienie ich raz, tylko po to, abyś zaznajomił się, jak powinien wyglądać ich efekt.</p>\n<p>Przed uruchomieniem modułu testów zainstaluj jego zależności przed z``cd``owanie do katalogu <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> Django a następnie uruchomienie:</p>\n<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>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>requirements/py3.txt\n</code></pre></div>\n<p>Jeśli napotkasz błąd w trakcie instalacji, może to oznaczać, że w twoim systemie brakuje zależności dla jednego lub więcej pythonowych pakietów. Sprawdź dokumentację pakietów, które zgłaszają błąd lub przeszukaj sieć z komunikatem błędu, który napotkałeś.</p>\n<p>Jesteśmy gotowi do uruchomienia zestawu testów. Jeśli używasz GNU/Linuksa, macOS-a lub innego rodzaju Uniksa, uruchom:</p>\n<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>./runtests.py\n</code></pre></div>\n<p>Teraz usiądź i odpręż się. Cały zestaw testów Django ma ich ponad 9600, więc ich wykonywanie może zająć coś pomiędzy 5 a 15 minutami, w zależności od szybkości twojego komputera.</p>\n<p>Kiedy uruchomisz zestaw testów Django, zobaczysz strumień znaków oznaczających status każdego testu w trakcie uruchomienia. <code class=\"docutils literal notranslate\"><span class=\"pre\">E</span></code> oznacza, że został zgłoszony błąd podczas testu, <code class=\"docutils literal notranslate\"><span class=\"pre\">F</span></code> oznacza, że asercje testu nie zostały spełnione. Obie z nich są traktowane jako porażki testów. Jednocześnie <code class=\"docutils literal notranslate\"><span class=\"pre\">x</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">s</span></code> oznaczają kolejno spodziewane porażki i ominięte testy. Kropki oznaczają pomyślne przechodzenie testu.</p>\n<p>Testy omijane są zazwyczaj z powodu brakujących zewnętrznych bibliotek wymaganaych do uruchomienia testu; zobacz <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/unit-tests/#running-unit-tests-dependencies\"><span class=\"std std-ref\">Running all the tests</span></a>, aby obejrzeć listę zależności i upewnij się, że zainstalowałeś te, które są związane ze zmianami, które wprowadzasz (nie będziemy potrzebować żadnej w tym tutorialu). Niektóre testy są właściwe dla wybranego back-endu bazodanowego i zostaną ominięte, jeśli test nie odbywa się z tym back-endem. Aby uruchomić testy z użyciem innego back-endu, sprawdź <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">Using another settings module</span></a>.</p>\n<p>Kiedy testy się skończą, powinieneś zobaczyć komunikat informujący, czy zestaw testów udał się czy odniósł porażkę. Nie zrobiłeś żadnych zmian w kodzie Django, więc cały zestaw testów <strong>powinien</strong> się udać. Jeśli otrzymujesz porażki lub błędy upewnij się, że poprzednie kroki wykonałeś odpowiednio. Zobacz więcej informacji w <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/unit-tests/#running-unit-tests\"><span class=\"std std-ref\">Running the unit tests</span></a>. Jeśli używasz Pythona 3.5+, zobaczysz kilka porażek związanych z ostrzeżeniami o dezaktualizacji, które możesz zignorować. Te błędy zostały już poprawione w Django.</p>\n<p>Zwróć uwagę, że najnowsza wersja trunka Django może nie zawsze być stabilna. Kiedy dewelopujesz z użyciem trunka, możesz sprawdzić <a class=\"reference external\" href=\"https://djangoci.com\">Django’s continous integration builds</a>, aby zweryfikować czy porażki są specyficzne dla twojej maszyny czy są również obecne w oficjalnych buildach Django. Jeśli klikniesz, aby zobaczyć poszczególny build, możesz zobaczyć „Configuration Matrix”, która pokazuje porażki uzyskane w poszczególnych wersjach Pythona i bazodanowego backendu.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Informacja</p>\n<p>Na potrzeby tego tutorialu i zgłoszenia, nad którym pracujemy, testowanie z użyciem SQLite wystarczy, chociaż jest możliwe (i czasem niezbędne), aby <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">uruchomić testy używając innej bazy danych</span></a>.</p>\n</aside>\n</section>\n<section id=\"creating-a-branch-for-your-patch\">\n<h2>Tworzenie brancha dla swojego patcha<a class=\"heading-anchor\" href=\"#creating-a-branch-for-your-patch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Przed wprowadzeniem jakichkolwiek zmian, stwórz nowy branch dla zgłoszenia:</p>\n<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>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>ticket_24788\n</code></pre></div>\n<p>Możesz wybrać dowolną nazwę dla brancha, na przykład „ticket_24788”. Wszystkie zmiany zrobione w tym branchu będą specyficzne dla zgłoszenia i nie wpłyną na główną kopię kodu, którą wcześniej sklonowaliśmy.</p>\n</section>\n<section id=\"writing-some-tests-for-your-ticket\">\n<h2>Pisanie testów do twojego zgłoszenia<a class=\"heading-anchor\" href=\"#writing-some-tests-for-your-ticket\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>W większości przypadków, aby poprawka została wcielona do Django, musi zawierać testy. Dla poprawek błędów znaczy to napisanie testu regresyjnego, aby upewnić się, że bug nie zostanie wprowadzony z powrotem w przyszłości. Test regresyjny powinien zostać napisany w taki sposób, aby nie przechodził jeśli bug nadal istnieje i aby przechodził wtedy, kiedy bug zostanie naprawiony. Dla poprawek zawierających nowe funkcjonalności, musisz załączyć testy, które pozwolą się upewnić, że ta nowa funkcja działa poprawnie. One też powinny nie przechodzić kiedy nie ma nowej funkcji i przechodzić wtedy, kiedy zostanie ona zaimplementowana.</p>\n<p>Dobrym sposobem na to jest napisanie twoich testów najpierw, przed jakimikolwiek zmianami w kodzie. Taki styl pracy jest nazywany <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Test-driven_development\">test-driven development</a> i może być zastosowany zarówno do całych projektów jak i pojedynczych poprawek. Po napisaniu testów możesz je uruchomić, aby upewnić się, że nie przechodzą (bo przecież nie naprawiłeś tego błędu lub nie dodałeś tej funkcjonalności). Jeśli twoje nowe testy przechodzą pomyślnie, musisz poprawić je, aby nie przechodziły. Koniec końców test regresyjny, który przechodzi pomyślnie niezależnie od obecności buga w kodzie, nie pomoże za bardzo w ochronie przed pojawieniem się go w przyszłości.</p>\n<p>Pora na nasz praktyczny przykład.</p>\n<section id=\"writing-some-tests-for-ticket-24788\">\n<h3>Pisanie kilku testów do zgłoszenia #24788<a class=\"heading-anchor\" href=\"#writing-some-tests-for-ticket-24788\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Zgłoszenie <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> jest propozycją dodania małej funkcjonalności: możliwości ustalenia atrybutu <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> na poziomie klasy dla klas From, aby:</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>[…] forms which ship with apps could effectively namespace themselves such\nthat N overlapping form fields could be POSTed at once and resolved to the\ncorrect form.\n</code></pre></div>\n<p>Aby rozwiązać zgłoszenie, dodamy atrybut <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> do klasy <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code>. Podczas tworzenia instancji tej klasy, podanie prefiksu do metody <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> nadal będzie ustawiać ten prefiks na tworzonej instancji. Lecz nie podanie prefiksu (lub podanie <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>) spowoduje użycie prefiksu na poziomie klasy. Ale zanim wprowadzimy te zmiany, napiszemy kilka testów, aby zweryfikować, że nasze modyfikacje działają poprawnie i będą działać poprawnie w przyszłości.</p>\n<p>Przejdź do folderu Django <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/forms_tests/tests/</span></code> i otwórz plik <code class=\"docutils literal notranslate\"><span class=\"pre\">test_forms.py</span></code>. Dodaj poniższy kod w linii 1674, tuż przed funkcją <code class=\"docutils literal notranslate\"><span class=\"pre\">test_forms_with_null_boolean</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_class_prefix</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Prefix can be also specified at the class level.</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n        <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">CharField</span><span class=\"p\">()</span>\n        <span class=\"n\">prefix</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;foo&#39;</span>\n\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">()</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">prefix</span><span class=\"p\">,</span> <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">prefix</span><span class=\"p\">,</span> <span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ten nowy test sprawdza czy ustawienie prefiksu na poziomie klasy działa zgodnie z oczekiwaniami i czy przekazanie parametru <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> podczas tworzenia instancji też nadal działa.</p>\n<aside class=\"admonition-but-this-testing-thing-looks-kinda-hard admonition\">\n<p class=\"admonition-title\">Ale to całe testowanie wygląda na dość ciężkie…</p>\n<p>Jeśli nie miałeś nigdy wcześniej do czynienia z testami, mogą wyglądać na trochę trudne do pisania na pierwszy rzut oka. Na szczęście testowanie jest <em>bardzo</em> dużym tematem w programowaniu komputerów, więc można znaleźć na jego temat wiele informacji:</p>\n<ul class=\"simple\">\n<li><p>Dobry artykuł na początek o pisaniu testów do Django można znaleźć w dokumentacji: <a class=\"reference internal\" href=\"/pl/1.11/topics/testing/overview/\"><span class=\"doc\">Writing and running tests</span></a>.</p></li>\n<li><p>Dive Into Python (darmowa książka online dla początkujących Python-deweloperów) zawiera świetny <a class=\"reference external\" href=\"http://www.diveintopython3.net/unit-testing.html\">wstęp do testów jednostkowych</a>.</p></li>\n<li><p>Po ich przeczytaniu, jeśli chcesz zanurzyć zęby w czymś bardziej mięsistym, jest zawsze dokumentacja <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(w Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a> Pythona.</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"running-your-new-test\">\n<h3>Uruchomienie twojego nowego testu<a class=\"heading-anchor\" href=\"#running-your-new-test\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pamiętaj, że nie wprowadziliśmy jeszcze żadnych zmian do <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code>, więc nasze testy się powiodą. Uruchommy wszystkie testy w katalogu <code class=\"docutils literal notranslate\"><span class=\"pre\">forms_tests</span></code>, aby upewnić się, że to rzeczywiście się dzieje. Z linii komend, wejdź <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> do katalogu <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> Django i odpal:</p>\n<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>./runtests.py<span class=\"w\"> </span>forms_tests\n</code></pre></div>\n<p>Jeśli testy przebiegły poprawnie, powinieneś zobaczyć jeden błąd związany z metodą testującą, którą dodaliśmy. Jeśli wszystkie testy przeszły bez błędów, upewnij się, że dodałeś nowy test pokazany powyżej do odpowiedniego folderu i klasy.</p>\n</section>\n</section>\n<section id=\"writing-the-code-for-your-ticket\">\n<h2>Pisanie kodu do twojego zgłoszenia<a class=\"heading-anchor\" href=\"#writing-the-code-for-your-ticket\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Następnie będziemy dodawać do Django funkcjonalność opisaną w zgłoszeniu <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a>.</p>\n<section id=\"writing-the-code-for-ticket-24788\">\n<h3>Pisanie kodu do zgłoszenia #24788<a class=\"heading-anchor\" href=\"#writing-the-code-for-ticket-24788\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Przejdź do folderu <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django/forms</span></code> i otwórz plik <code class=\"docutils literal notranslate\"><span class=\"pre\">forms.py</span></code>. Znajdź klasę <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code> (linia 72.) i dodaj atrybut klasy <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> tuż za atrybutem <code class=\"docutils literal notranslate\"><span class=\"pre\">field_order</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseForm</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"c1\"># This is the main implementation of all the Form logic. Note that this</span>\n    <span class=\"c1\"># class is different than Form. See the comments by the Form class for</span>\n    <span class=\"c1\"># more information. Any improvements to the form API should be made to</span>\n    <span class=\"c1\"># *this* class, not to the Form class.</span>\n    <span class=\"n\">field_order</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    <span class=\"n\">prefix</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n</section>\n<section id=\"verifying-your-test-now-passes\">\n<h3>Weryfikacja, czy twoje testy teraz przechodzą<a class=\"heading-anchor\" href=\"#verifying-your-test-now-passes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Gdy już skończysz modyfikować Django, musimy się upewnić, że testy, które napisaliśmy wcześniej przechodzą, aby sprawdzić czy kod, który napisaliśmy powyżej działa poprawnie. Aby uruchomić testy w folderze <code class=\"docutils literal notranslate\"><span class=\"pre\">forms_tests</span></code>, wejdź <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> w katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> Django i uruchom:</p>\n<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>./runtests.py<span class=\"w\"> </span>forms_tests\n</code></pre></div>\n<p>Ups, całe szczęście że napisaliśmy te testy! Powinieneś widzieć dalej jedną porażkę z następującym wyjątkiem:</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=\"ne\">AssertionError</span><span class=\"p\">:</span> <span class=\"kc\">None</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;foo&#39;</span>\n</code></pre></div>\n<p>Zapomnieliśmy dodać wyrażenie warunkowe w metodzie <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code>. Zmień <code class=\"docutils literal notranslate\"><span class=\"pre\">self.prefix</span> <span class=\"pre\">=</span> <span class=\"pre\">prefix</span></code>, które jest teraz w linii 87. pliku <code class=\"docutils literal notranslate\"><span class=\"pre\">django/forms/forms.py</span></code>, dodając wyrażenie warunkowe:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">prefix</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">prefix</span> <span class=\"o\">=</span> <span class=\"n\">prefix</span>\n</code></pre></div>\n<p>Uruchom ponownie testy, wszystko powinno przejść. Jeśli nie przejdzie, upewnij się, że poprawnie zmodyfikowałeś klasę <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code> jak jest pokazane powyżej i skopiowałeś poprawnie nowy test.</p>\n</section>\n</section>\n<section id=\"running-django-s-test-suite-for-the-second-time\">\n<h2>Uruchamianie zestawu testów Django drugi raz<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-second-time\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Kiedy zweryfikowałeś, że twoje poprawki i testy działają poprawnie, dobrym pomysłem jest uruchomić cały zestaw testów Django, aby zweryfikować tylko, czy twoja zmiana nie wprowadziła żadnych bugów w innych obszarach Django.</p>\n<p>Aby uruchomić zestaw testów Django w całości, wejdź <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> w katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> Django i uruchom:</p>\n<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>./runtests.py\n</code></pre></div>\n<p>Jeśli nie widzisz żadnych błędów, śmiało możesz iść dalej.</p>\n</section>\n<section id=\"writing-documentation\">\n<h2>Pisanie dokumentacji<a class=\"heading-anchor\" href=\"#writing-documentation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>To nowa funkcjonalność, więc powinna zostać udokumentowana. Dodaj następującą sekcję w linii 1068. (na końcu pliku) w pliku <code class=\"docutils literal notranslate\"><span class=\"pre\">django/docs/ref/forms/api.txt</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>The prefix can also be specified on the form class::\n\n    &gt;&gt;&gt; class PersonForm(forms.Form):\n    ...     ...\n    ...     prefix = &#39;person&#39;\n\n.. versionadded:: 1.9\n\n    The ability to specify ``prefix`` on the form class was added.\n</code></pre></div>\n<p>Jako że ta nowa funkcjonalność będzie w nadchodzącym wydaniu, dodajemy ją też do informacji o wydaniu dla Django 1.9, w linii 164. w sekcji „Forms” w pliku <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/releases/1.9.txt</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>* A form prefix can be specified inside a form class, not only when\n  instantiating a form. See :ref:`form-prefix` for details.\n</code></pre></div>\n<p>Po więcej informacji na temat pisania dokumentacji, wliczając wyjaśnienie o co chodzi w cząstce <code class=\"docutils literal notranslate\"><span class=\"pre\">versionadded</span></code>, odsyłamy do <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-documentation/\"><span class=\"doc\">Writing documentation</span></a>. Ta strona zawiera również wyjaśnienie jak zbudować lokalnie kopię dokumentacji, aby móc obejrzeć HTML, który zostanie później wygenerowany.</p>\n</section>\n<section id=\"previewing-your-changes\">\n<h2>Podgląd twoich zmian<a class=\"heading-anchor\" href=\"#previewing-your-changes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Teraz przejrzyjmy wszystkie zmiany, które wprowadziliśmy przy naszej poprawce. Wyświetl różnice pomiędzy swoją kopią Django (z twoimi zmianami) a wersją, którą pierwotnie zcheckoutowałeś wcześniej w tym tutorialu:</p>\n<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>git<span class=\"w\"> </span>diff\n</code></pre></div>\n<p>Użyj klawiszy strzałek, aby przesuwać się do góry i w dół.</p>\n<div class=\"code-block\" data-language=\"diff\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Diff</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=\"Diff code\"><code><span class=\"gh\">diff --git a/django/forms/forms.py b/django/forms/forms.py</span>\n<span class=\"gh\">index 509709f..d1370de 100644</span>\n<span class=\"gd\">--- a/django/forms/forms.py</span>\n<span class=\"gi\">+++ b/django/forms/forms.py</span>\n<span class=\"gu\">@@ -75,6 +75,7 @@ class BaseForm(object):</span>\n<span class=\"w\"> </span>    # information. Any improvements to the form API should be made to *this*\n<span class=\"w\"> </span>    # class, not to the Form class.\n<span class=\"w\"> </span>    field_order = None\n<span class=\"gi\">+    prefix = None</span>\n\n<span class=\"w\"> </span>    def __init__(self, data=None, files=None, auto_id=&#39;id_%s&#39;, prefix=None,\n<span class=\"w\"> </span>                 initial=None, error_class=ErrorList, label_suffix=None,\n<span class=\"gu\">@@ -83,7 +84,8 @@ class BaseForm(object):</span>\n<span class=\"w\"> </span>        self.data = data or {}\n<span class=\"w\"> </span>        self.files = files or {}\n<span class=\"w\"> </span>        self.auto_id = auto_id\n<span class=\"gd\">-        self.prefix = prefix</span>\n<span class=\"gi\">+        if prefix is not None:</span>\n<span class=\"gi\">+            self.prefix = prefix</span>\n<span class=\"w\"> </span>        self.initial = initial or {}\n<span class=\"w\"> </span>        self.error_class = error_class\n<span class=\"w\"> </span>        # Translators: This is the default suffix added to form field labels\n<span class=\"gh\">diff --git a/docs/ref/forms/api.txt b/docs/ref/forms/api.txt</span>\n<span class=\"gh\">index 3bc39cd..008170d 100644</span>\n<span class=\"gd\">--- a/docs/ref/forms/api.txt</span>\n<span class=\"gi\">+++ b/docs/ref/forms/api.txt</span>\n<span class=\"gu\">@@ -1065,3 +1065,13 @@ You can put several Django forms inside one ``&lt;form&gt;`` tag. To give each</span>\n<span class=\"w\"> </span>    &gt;&gt;&gt; print(father.as_ul())\n<span class=\"w\"> </span>    &lt;li&gt;&lt;label for=&quot;id_father-first_name&quot;&gt;First name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-first_name&quot; id=&quot;id_father-first_name&quot; /&gt;&lt;/li&gt;\n<span class=\"w\"> </span>    &lt;li&gt;&lt;label for=&quot;id_father-last_name&quot;&gt;Last name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-last_name&quot; id=&quot;id_father-last_name&quot; /&gt;&lt;/li&gt;\n<span class=\"gi\">+</span>\n<span class=\"gi\">+The prefix can also be specified on the form class::</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+    &gt;&gt;&gt; class PersonForm(forms.Form):</span>\n<span class=\"gi\">+    ...     ...</span>\n<span class=\"gi\">+    ...     prefix = &#39;person&#39;</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+.. versionadded:: 1.9</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+    The ability to specify ``prefix`` on the form class was added.</span>\n<span class=\"gh\">diff --git a/docs/releases/1.9.txt b/docs/releases/1.9.txt</span>\n<span class=\"gh\">index 5b58f79..f9bb9de 100644</span>\n<span class=\"gd\">--- a/docs/releases/1.9.txt</span>\n<span class=\"gi\">+++ b/docs/releases/1.9.txt</span>\n<span class=\"gu\">@@ -161,6 +161,9 @@ Forms</span>\n<span class=\"w\"> </span>  :attr:`~django.forms.Form.field_order` attribute, the ``field_order``\n<span class=\"w\"> </span>  constructor argument , or the :meth:`~django.forms.Form.order_fields` method.\n\n<span class=\"gi\">+* A form prefix can be specified inside a form class, not only when</span>\n<span class=\"gi\">+  instantiating a form. See :ref:`form-prefix` for details.</span>\n<span class=\"gi\">+</span>\n<span class=\"w\"> </span>Generic Views\n<span class=\"w\"> </span>^^^^^^^^^^^^^\n\n<span class=\"gh\">diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py</span>\n<span class=\"gh\">index 690f205..e07fae2 100644</span>\n<span class=\"gd\">--- a/tests/forms_tests/tests/test_forms.py</span>\n<span class=\"gi\">+++ b/tests/forms_tests/tests/test_forms.py</span>\n<span class=\"gu\">@@ -1671,6 +1671,18 @@ class FormsTestCase(SimpleTestCase):</span>\n<span class=\"w\"> </span>        self.assertEqual(p.cleaned_data[&#39;last_name&#39;], &#39;Lennon&#39;)\n<span class=\"w\"> </span>        self.assertEqual(p.cleaned_data[&#39;birthday&#39;], datetime.date(1940, 10, 9))\n\n<span class=\"gi\">+    def test_class_prefix(self):</span>\n<span class=\"gi\">+        # Prefix can be also specified at the class level.</span>\n<span class=\"gi\">+        class Person(Form):</span>\n<span class=\"gi\">+            first_name = CharField()</span>\n<span class=\"gi\">+            prefix = &#39;foo&#39;</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+        p = Person()</span>\n<span class=\"gi\">+        self.assertEqual(p.prefix, &#39;foo&#39;)</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+        p = Person(prefix=&#39;bar&#39;)</span>\n<span class=\"gi\">+        self.assertEqual(p.prefix, &#39;bar&#39;)</span>\n<span class=\"gi\">+</span>\n<span class=\"w\"> </span>    def test_forms_with_null_boolean(self):\n<span class=\"w\"> </span>        # NullBooleanField is a bit of a special case because its presentation (widget)\n<span class=\"w\"> </span>        # is different than its data. This is handled transparently, though.\n</code></pre></div>\n<p>Kiedy skończysz oglądać patch, kliknij przycisk <code class=\"docutils literal notranslate\"><span class=\"pre\">q</span></code>, aby wyjść i wrócić do linii komend. Jeśli treść patcha wyglądała w porządku, czas na scommitowanie zmian.</p>\n</section>\n<section id=\"committing-the-changes-in-the-patch\">\n<h2>Commitowanie zmian w patchu<a class=\"heading-anchor\" href=\"#committing-the-changes-in-the-patch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Aby scommitować zmiany:</p>\n<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>git<span class=\"w\"> </span>commit<span class=\"w\"> </span>-a\n</code></pre></div>\n<p>Powoduje to otwarcie edytora tekstu do wpisania „commit message”. Zrealizuj <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">zalecenia commit message’y</span></a> i napisz notatkę w ten sposób:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>Fixed #24788 -- Allowed Forms to specify a prefix at the class level.\n</code></pre></div>\n</section>\n<section id=\"pushing-the-commit-and-making-a-pull-request\">\n<h2>Pushowanie commita i tworzenie pull requesta<a class=\"heading-anchor\" href=\"#pushing-the-commit-and-making-a-pull-request\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Po skomitowaniu patcha, wyślij go do swojego forka na GitHubie (zamień „ticket_24788” z nazwą swojego brancha, jeśli jest inna):</p>\n<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>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_24788\n</code></pre></div>\n<p>Możesz stworzyć pull request odwiedzając <a class=\"reference external\" href=\"https://github.com/django/django/\">stronę Django na GitHubie</a>. Zobaczysz swój branch pod „Your recently pushed branches”. Kliknij „Compare &amp; pull request” obok niego.</p>\n<p>Prosimy nie rób tego z powodu tego tutoriala, ale na następnej stronie, która prezentuje podgląd zmian, kliknąłbyś „Create pull request”.</p>\n</section>\n<section id=\"next-steps\">\n<h2>Następne kroki<a class=\"heading-anchor\" href=\"#next-steps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Gratulacje, nauczyłeś się tworzyć pull requesty do Django! Szczegóły bardziej zaawansowanych technik, których możesz potrzebować są w <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Working with Git and GitHub</span></a>.</p>\n<p>Teraz możesz dobrze wykorzystać te umiejętności pomagając ulepszać bazowy kod Django.</p>\n<section id=\"more-information-for-new-contributors\">\n<h3>Więcej informacji dla nowych kontrybutorów<a class=\"heading-anchor\" href=\"#more-information-for-new-contributors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Zanim za bardzo wsiąkniesz w pisanie patchy Django, jest trochę więcej informacji o dawaniu wkładu, na które prawdopodobnie powinieneś spojrzeć:</p>\n<ul class=\"simple\">\n<li><p>Powinieneś się upewnić, że przeczytałeś dokumentację Django na temat <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">tworzenia zgłoszeń i wysyłania patchy</span></a>. Zawiera ona etykietę Traca, jak przypisywać sobie zgłoszenia, oczekiwany styl kodowania w patchach i wiele innych ważnych szczegółów.</p></li>\n<li><p>Ci, którzy mają styczność pierwszy raz z wnoszeniem wkładu do kodu, powinni przeczytać też <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/new-contributors/\"><span class=\"doc\">dokumentację Django dla nowych kontrybutorów</span></a>. Zawiera wiele dobrych rad dla tych, którzy są nowi w pomaganiu w Django.</p></li>\n<li><p>Dalej, jeśli wciąż jesteś głodny informacji o współtworzeniu, zawsze możesz przejrzeć resztę <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/\"><span class=\"doc\">dokumentacji Django na temat współtorzenia</span></a>. Zawiera tonę przydatnych informacji i powinna być twoim pierwszym źródłem, odpowiadającym na każde pytanie, które możesz mieć.</p></li>\n</ul>\n</section>\n<section id=\"finding-your-first-real-ticket\">\n<h3>Znajdowanie twojego pierwszego prawdziwego zgłoszenia<a class=\"heading-anchor\" href=\"#finding-your-first-real-ticket\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Kiedy już przejrzałeś trochę z tych informacji, będziesz gotowy iść i znaleźć zgłoszenie, do którego napiszesz patcha. Zwróć szczególną uwagę na zgłoszenia z kryterium „easy pickings”. Te zgłoszenia często są z natury dużo prostsze i są świetne dla pierwszorazowych kontrybutorów. Gdy już będziesz zaznajomiony z wnoszeniem wkładu w Django, możesz iść dalej i pisać patche do trudniejszych i bardziej skomplikowanych zgłoszeń.</p>\n<p>Jeśli po prostu już chcesz zacząć (nikt nie będzie cię winił!), spróbuj rzucić okiem na listę <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;has_patch=0&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">łatwych zgłoszeń, które potrzebują patchy</a> i <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;needs_better_patch=1&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">łatwych zgłoszeń, które mają patche potrzebujące poprawy</a>. Jeśli umiesz pisać testy, możesz też spojrzeć na listę <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;needs_tests=1&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">łatwych zgłoszeń, które potrzebują testów</a>. Pamiętaj tylko przestrzegać wskazówek dotyczących przypisywania zgłoszeń, o czym było wspomniane w odnośniku do dokumentacji Django na temat <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">przypisywania zgłoszeń i wgrywaniu patchy</span></a>.</p>\n</section>\n<section id=\"what-s-next-after-creating-a-pull-request\">\n<h3>Co dalej po stworzeniu pull requesta?<a class=\"heading-anchor\" href=\"#what-s-next-after-creating-a-pull-request\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Po tym, jak ticket ma patcha, musi zostać przejrzany przez drugą parę oczu. Po wysłaniu pull requesta zaktualizuj metadane ticketu ustawiając na tickecie flagi, które mówią „has patch”, „doesn’t need tests” i tak dalej, aby inni mogli go znaleźć do przejrzenia. Wnoszenie wkładu niekoniecznie zawsze znaczy pisanie patcha od zera. Przeglądanie istniejących patchy jest również bardzo pomocnym wkładem. Zobacz <a class=\"reference internal\" href=\"/pl/1.11/internals/contributing/triaging-tickets/\"><span class=\"doc\">Triaging tickets</span></a> po szczegóły.</p>\n</section>\n</section>","rootId":"writing-your-first-patch-for-django","toc":[{"title":"Wprowadzenie","anchor":"introduction","children":[{"title":"Dla kogo jest ten tutorial?","anchor":"who-s-this-tutorial-for","children":[]},{"title":"Co zawiera ten przewodnik?","anchor":"what-does-this-tutorial-cover","children":[]}]},{"title":"Kodeks Postępowania","anchor":"code-of-conduct","children":[]},{"title":"Instalacja Git’a","anchor":"installing-git","children":[]},{"title":"Uzyskiwanie kopii wersji rozwojowej Django","anchor":"getting-a-copy-of-django-s-development-version","children":[]},{"title":"Powracanie do poprzedniej wersji Django","anchor":"rolling-back-to-a-previous-revision-of-django","children":[]},{"title":"Uruchomienie zestawu testów Django po raz pierwszy","anchor":"running-django-s-test-suite-for-the-first-time","children":[]},{"title":"Tworzenie brancha dla swojego patcha","anchor":"creating-a-branch-for-your-patch","children":[]},{"title":"Pisanie testów do twojego zgłoszenia","anchor":"writing-some-tests-for-your-ticket","children":[{"title":"Pisanie kilku testów do zgłoszenia #24788","anchor":"writing-some-tests-for-ticket-24788","children":[]},{"title":"Uruchomienie twojego nowego testu","anchor":"running-your-new-test","children":[]}]},{"title":"Pisanie kodu do twojego zgłoszenia","anchor":"writing-the-code-for-your-ticket","children":[{"title":"Pisanie kodu do zgłoszenia #24788","anchor":"writing-the-code-for-ticket-24788","children":[]},{"title":"Weryfikacja, czy twoje testy teraz przechodzą","anchor":"verifying-your-test-now-passes","children":[]}]},{"title":"Uruchamianie zestawu testów Django drugi raz","anchor":"running-django-s-test-suite-for-the-second-time","children":[]},{"title":"Pisanie dokumentacji","anchor":"writing-documentation","children":[]},{"title":"Podgląd twoich zmian","anchor":"previewing-your-changes","children":[]},{"title":"Commitowanie zmian w patchu","anchor":"committing-the-changes-in-the-patch","children":[]},{"title":"Pushowanie commita i tworzenie pull requesta","anchor":"pushing-the-commit-and-making-a-pull-request","children":[]},{"title":"Następne kroki","anchor":"next-steps","children":[{"title":"Więcej informacji dla nowych kontrybutorów","anchor":"more-information-for-new-contributors","children":[]},{"title":"Znajdowanie twojego pierwszego prawdziwego zgłoszenia","anchor":"finding-your-first-real-ticket","children":[]},{"title":"Co dalej po stworzeniu pull requesta?","anchor":"what-s-next-after-creating-a-pull-request","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Pierwsze kroki","url":"/pl/1.11/intro/"}],"prev":{"docname":"intro/whatsnext","title":"Co czytać dalej","url":"/pl/1.11/intro/whatsnext/"},"next":{"docname":"topics/index","title":"Używanie Django","url":"/pl/1.11/topics/"},"formats":{"html":"/pl/1.11/intro/contributing/","markdown":"/pl/1.11/intro/contributing.md","json":"/pl/1.11/intro/contributing.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/intro/contributing.txt","official":"https://docs.djangoproject.com/pl/1.11/intro/contributing/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}