{"title":"Menulis tambalan pertama anda untuk Django","version":"2.0","locale":"id","docname":"intro/contributing","url":"/id/2.0/intro/contributing/","canonical":"https://djangodocs.dev/id/2.0/intro/contributing/","summary":"Tertarik membalas kepada komunitas kecil? Mungkin Anda menemukan bug di Django yang ingin Anda perbaiki, atau mungkin ada fitur kecil yang ingin Anda…","html":"<h1>Menulis tambalan pertama anda untuk 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>Kata Pengantar<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tertarik membalas kepada komunitas kecil? Mungkin Anda menemukan bug di Django yang ingin Anda perbaiki, atau mungkin ada fitur kecil yang ingin Anda tambahkan.</p>\n<p>Membantu kembali Django itu sendiri adalah jalan terbaik untuk melihat masalah anda sendiri ditangani. Ini mungkin terlihat menakutkan pertama kali, tetapi itu sangat mudah. Kami akan berjalan bersama anda melalui pengolahan seluruhnya, sehingga anda dapat belajar berdasarkan contoh.</p>\n<section id=\"who-s-this-tutorial-for\">\n<h3>Untuk siapa saja tutorial ini?<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\" role=\"note\">\n<p class=\"admonition-title\">Lihat juga</p>\n<p>Jika anda mencari referensi bagaimana mengajukan tambalan, lihat dokumentasi <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">Mengajukan tambalan</span></a>.</p>\n</aside>\n<p>Untuk tutorial ini, kami berharap bahwa anda mempunyai setidaknya pengertian dasar bagaimana Django bekerja. Ini berarti anda harus nyaman melalui tutorial yang ada pada <a class=\"reference internal\" href=\"/id/2.0/intro/tutorial01/\"><span class=\"doc\">writing your first Django app</span></a>. Sebagai tambahan, anda harus mempunyai pemahaman bagus dari Phyton itu sendiri. Tetapi jika anda tidak, <a class=\"reference external\" href=\"http://www.diveintopython3.net/\">Dive Into Python</a> adalah luar biasa (dan gratis) buku daring untuk programer pemula Phyton.</p>\n<p>Bagi anda yang tidak akrab dengan vesi kendali sistem dan Trac akan menemukan bahwa tutorial ini dan tautannya memasukkan informasi cukup untuk memulai. Bagaimanapun, anda akan mungkin membaca beberapa lebih alat berbeda jika anda berencana sering untuk membantu Django.</p>\n<p>Untuk sebagian besar, tutorial ini mencoba menjelaskan sebanyak mungkin, sehingga itu dapat digunakan pada pendengar luas.</p>\n<aside class=\"admonition-where-to-get-help admonition\" role=\"note\">\n<p class=\"admonition-title\">Dimana mendapatkan bantuan:</p>\n<p>Jika anda mempunyai masalah melalui tutorial ini, siahkan tempatkan pesan ke <a class=\"reference internal\" href=\"/id/2.0/internals/mailing-lists/#django-developers-mailing-list\"><span class=\"std std-ref\">django-developers</span></a> atau jatuhkan dengan <a class=\"reference external\" href=\"irc://irc.freenode.net/django-dev\">#django-dev on irc.freenode.net</a> untuk mengobrol dengan pengguna Django lainnya yang mungkin dapat membantu.</p>\n</aside>\n</section>\n<section id=\"what-does-this-tutorial-cover\">\n<h3>Tutorial ini meliputi apa?<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>Kami akan berjalan bersama anda dalam membantu tambakan ke Django untuk pertama kali. Pada akhir tutorial ini, anda harus mempunyai pengertian dasar dari kedua alat dan pengolahan yang terlibat. Khususnya, kami akan mencangkup berikut:</p>\n<ul class=\"simple\">\n<li><p>Memasang Git</p></li>\n<li><p>Bagaimana mengunduh pengembangan salinan Django.</p></li>\n<li><p>Menjalankan rangkaian percobaan Django.</p></li>\n<li><p>Menulis percobaan untuk tambalan anda.</p></li>\n<li><p>Menulis kode untuk tambalan anda.</p></li>\n<li><p>Mencoba tambahan anda.</p></li>\n<li><p>Mengajukan pull request</p></li>\n<li><p>Dimana mencari untuk informasi lebih.</p></li>\n</ul>\n<p>Sekali anda selesai dengan tutorial, anda dapat mencari sisa dari <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/\"><span class=\"doc\">Django's documentation on contributing</span></a>. Itu mengandung banyak informasi hebat dan harus dibaca untuk siapapun yang suka menjadi penyumbang rutin ke Django. Jika anda mendapatkan pertanyaan, itu mungkin mendapatkan jawaban.</p>\n<aside class=\"admonition-python-3-required admonition\" role=\"note\">\n<p class=\"admonition-title\">Python 3 wajib!</p>\n<p>Versi Django ini tidak mendukung Python 2.7. Dapatkan Python 3 di <a class=\"reference external\" href=\"https://www.python.org/downloads/\">Halaman unduh Python</a> atau menggunakan paket manajer dari sistem operasi yang Anda gunakan.</p>\n</aside>\n<aside class=\"admonition-for-windows-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Untuk pengguna Windows</p>\n<p>Ketika memasang Python di Windows, pastikan anda mencentang pilihan &quot;Tambah phyton.exe ke Jalur&quot;, sehingga dia selalu tersedia di baris perintah.</p>\n</aside>\n</section>\n</section>\n<section id=\"code-of-conduct\">\n<h2>Kode Etik<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>Sebagai penyumbang, anda dapat membantu kami menjaga komunitas Django terbuka dan inklusif. Silahkan baca dan ikuti <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Code of Conduct &lt;<a class=\"reference external\" href=\"https://www.djangoproject.com/conduct/\">https://www.djangoproject.com/conduct/</a>&gt;`_ kami.</p>\n</section>\n<section id=\"installing-git\">\n<h2>Memasang Git<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>Untuk tutorial ini, anda akan membutuhkan Git terpasang untuk mengunduh versi pengembangan saat ini dari Django dan membangkitkan berkas tambalan untuk perubahan anda buat.</p>\n<p>Untuk memeriksa apakah atau tidak anda telah terpasang Git, masukkan <code class=\"docutils literal notranslate\">git</code> ke baris perintah. Jika anda mendapatkan pesan dimana perintah ini tidak ditemukan, anda akan perlu mengunduh dan memasangnya, lihat <a class=\"reference external\" href=\"https://git-scm.com/download\">Halaman unduh Git</a>.</p>\n<aside class=\"admonition-for-windows-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Untuk pengguna Windows</p>\n<p>Ketika memasang Git pada Windows, sangat dianjurkan bahwa anda mengambil pilihan &quot;Git Bash&quot; sehingga Git berjalan di shell sendiri. Tutorial ini menganggap bahwa anda telah memasangnya.</p>\n</aside>\n<p>Jika anda tidak akrab dengan Git, anda dapat selalu menemukan lebih tentang perintahnya (pertama dia dipasang) dengan mengetik <code class=\"docutils literal notranslate\">git help</code> kedalam baris perintah.</p>\n</section>\n<section id=\"getting-a-copy-of-django-s-development-version\">\n<h2>Mendapatkan salinan versi pengembangan 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>Langkah pertama untuk membantu Django adalah mendapatkan sebuah salinan dari kode sumber. Pertama, <a class=\"reference external\" href=\"https://github.com/django/django/fork\">fork Django on GitHub</a>. Kemudian, dari baris perintah, gunakan perintah <code class=\"docutils literal notranslate\">cd</code> untuk melayari ke direktori dimana anda akan ingin salinan lokal anda dari Django menjadi langsung.</p>\n<p>Unduh gudang kode sumber Django menggunakan perintah berikut:</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 clone git@github.com:YourGitHubName/django.git\n</code></pre></div>\n<p>Sekarang bahwa anda mempunyai salinan lokal Django, anda dapat memasangnya seperti anda akan memasang paket apapun menggunakan <code class=\"docutils literal notranslate\">pip</code>. Cara paling mudah melakukannya adalah dengan menggunakan <em>virtual environment</em> (or virtualenv) dimana fitur tersebut dibangun kedalam Phyton yang mengizinkan anda untuk menjaga direktori terpisah dari paket terpasang untuk setiap proyek anda sehingga mereka tidak mengganggu satu sama lain.</p>\n<p>Adalah ide bagus untuk menjaga virtualenv anda dalam satu tempat, sebagai contoh dalam <code class=\"docutils literal notranslate\">.virtualenvs/</code> di direktori rumah anda. Buatlah jika itu tidak ada:</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 ~/.virtualenvs\n</code></pre></div>\n<p>Sekarang buat virtualenv baru dengan menjalankan:</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 -m venv ~/.virtualenvs/djangodev\n</code></pre></div>\n<p>Jalur dimana lingkungan baru akan disimpan ke komputer anda.</p>\n<aside class=\"admonition-for-windows-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Untuk pengguna Windows</p>\n<p>Menggunakan modul <code class=\"docutils literal notranslate\">venv</code> terpasang teptap tidak akan bekerja jika juga menggunakan shell Git Bash di Windows, sejak tulisan aktivasi hanya dibuat untuk sistem shell (<code class=\"docutils literal notranslate\">.bat</code>) and PowerShell (<code class=\"docutils literal notranslate\">.ps1</code>). Gunakan paket <code class=\"docutils literal notranslate\">virtualenv</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\" role=\"note\">\n<p class=\"admonition-title\">Untuk pengguna Ubuntu</p>\n<p>Pada beberapa versi Ubuntu perintah diatas mungkin gagal. Gunakan paket <code class=\"docutils literal notranslate\">virtualenv</code>, pertama pastikan anda mempunyai <code class=\"docutils literal notranslate\">pip3</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 apt-get install 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 install virtualenv\n<span class=\"gp\">$ </span>virtualenv --python<span class=\"o\">=</span><span class=\"sb\">`</span>which python3<span class=\"sb\">`</span> ~/.virtualenvs/djangodev\n</code></pre></div>\n</aside>\n<p>Langkah akhir dalam mengatur virtualenv anda adalah untuk mengaktifkannya:</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> ~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<p>Jika perintah <code class=\"docutils literal notranslate\">source</code> tidak tersedua, anda dapat mencoba menggunakan titik:</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>. ~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<aside class=\"admonition-for-windows-users admonition\" role=\"note\">\n<p class=\"admonition-title\">Untuk pengguna Windows</p>\n<p>Untuk mengaktifkan virtualenv anda pada Windows, jalankan:</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>Anda harus mengaktifkan virtualenv kapanpun anda membuka jendela terminal baru. <a class=\"reference external\" href=\"https://virtualenvwrapper.readthedocs.io/en/latest/\">virtualenvwrapper</a> adalah alat berguna untuk membuat ini lebih mudah.</p>\n<p>Apapun anda pasang mealui <code class=\"docutils literal notranslate\">pip</code> mulai sekarang akan dipasang di virtualenv baru anda, terpencil dari lingkungan lain dan paket sistem-lebar. Juga, nama dari virtualenv yang diaktifkan saat ini ditampilkan pada baris perintah untuk membantu anda tetap melacak yang mana anda gunakan. Pergilah dan pasang salinan kloning sebelumnya dari 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 install -e /path/to/your/local/clone/django/\n</code></pre></div>\n<p>Versi terpasang dari Django sekarang menunjuk pada salinan lokal anda. Anda akan segera melihat perubahan apapun anda buat, yang merupakan bantuan hebat ketika menulis tambalan pertama anda.</p>\n</section>\n<section id=\"rolling-back-to-a-previous-revision-of-django\">\n<h2>Gulir kembali ke perubahan sebelum dari 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>Untuk tutorial ini, kami akan menggunakan tiket <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> sebagai pembelajaran kasus, jadi kami akan memutar kembali sejarah versi Django di git sebelum tambalan tiket tersebut diberlakukan. Ini akan mengizinkan kami melalui semua langkah terlibat dalam penulisan tambalan dari coretan, termasuk menjalankan deretan percobaan Django.</p>\n<p><strong>Ingat-ingat bahwa selama kami akan menggunakan perubahan lama dari trunk Django untuk tujuan dari tutorial dibawah, anda harus selalu menggunakan perubahan pengembangan saat ini dari Django ketika bekerja pada tambahan sendiri untuk tiket!</strong></p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Tambalan untuk tiket ini ditulis oleh Paweł Marczewski, dan itu berlaku ke Django sebagai <a class=\"reference external\" href=\"https://github.com/django/django/commit/4df7e8483b2679fc1cba3410f08960bac6f51115\">commit 4df7e8483b2679fc1cba3410f08960bac6f51115</a>. Oleh karena itu, kami akan menggunakan perbaikan Django hanya sebelum itu, <a class=\"reference external\" href=\"https://github.com/django/django/commit/4ccfc4439a7add24f8db4ef3960d02ef8ae09887\">commit 4ccfc4439a7add24f8db4ef3960d02ef8ae09887</a>.</p>\n</aside>\n<p>Jelajahi kedalam direktori akar Django (itu yang mengandung <code class=\"docutils literal notranslate\">django</code>, <code class=\"docutils literal notranslate\">docs</code>, <code class=\"docutils literal notranslate\">tests</code>, <code class=\"docutils literal notranslate\">AUTHORS</code>, etc.). Anda dapat lalu memeriksa perbaikan lama Django yang akan kita gunakan dalam tutorial dibawah:</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 checkout 4ccfc4439a7add24f8db4ef3960d02ef8ae09887\n</code></pre></div>\n</section>\n<section id=\"running-django-s-test-suite-for-the-first-time\">\n<h2>Menjalankan rangkaian percobaan Django untuk pertama kali<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>Ketika membantu Django sangat penting bahwa perubahan kode anda tidak menimbulkan kesalahan kedalam kawasan lain dari Django. Satu cara memeriksa bahwa Django masih bekerja setelah anda membuat perubahan adalah dengan menjalankan deretan percobaan Django. Jika semua percobaan masih terlewati, lalu anda dapat beralasan yakin bahwa perubahan anda tidak akan merusak Django. Jika anda tidak pernah menjalankan deretan percobaan Django sebelumnya, adalah ide bagus untuk menjalankannya sekali sebelumnya untuk mendapatkan keakraban dengan keluarannya sesuai dengan seharusnya.</p>\n<p>Sebelum menjalankan deretan percobaan, pasang ketergantungannya dengan pertama men <code class=\"docutils literal notranslate\">cd</code> kan kedalam direktori <code class=\"docutils literal notranslate\">tests/</code> Django dan kemudian jalankan:</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 install -r requirements/py3.txt\n</code></pre></div>\n<p>Jika anda menjumpai sebuah kesalahan selama pemasangan, sistem anda mungkin kehilangan ketergantungan dari satu atau lebih paket-paket Python. Rundingkan dokumentasi paket-paket gagal atau cari Jaringan dengan pesan kesalahan yang anda jumpai.</p>\n<p>Sekarang kita siap menjalankan deretan percobaan. Jika anda menggunakan GNU/Linux, macOS, atau beberapa Unix rasa lainnya, jalankan:</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>Sekarang duduk dan santai, Deretan percobaan keseluruhan Django telah lebih 9,600 percobaan berbeda, sehingga itu dapat diambil dimanapun dari 5 sampai 15 menit untuk berjalan, tergantung pada kecepatan komputer anda.</p>\n<p>Selama deretan percobaan Django berjalan, anda akan melihat aliran karakter yang mewakili keadaan dari setiap percobaan ketika itu berjalan. <code class=\"docutils literal notranslate\">E</code> mengindikasikan bahwa sebuah kesalahan muncul selama percobaan, dan <code class=\"docutils literal notranslate\">F</code> mengindikasikan bahwa pernyataan percobaan gagal. Kedua dari ini dianggap menjadi kegagalan percobaan. Sementara itu, <code class=\"docutils literal notranslate\">x</code> dan <code class=\"docutils literal notranslate\">s</code> mengindikasikan kegagalan yang diharapkan dan melewati percobaan, masing-masing. Titik mengindikasikan lulus percobaan.</p>\n<p>Lewati percobaan biasanya karena kehilangan pustaka luar yang diwajibkan untuk menjalankan percobaan; lihat <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/unit-tests/#running-unit-tests-dependencies\"><span class=\"std std-ref\">Menjalankan semua percobaan</span></a> untuk daftar dari ketergantungan dan pastikan memasang tiap untuk percobaan terhubung ke perubahan anda sedang buat (kami tidak akan butuh untuk tutorial ini). Beberapa percobaan sangat khusus pada backend basisdata tertentu dan akan dilewati jika tidak dicobakan dengan backend itu. SQLite adalah backend basisdata untuk pengaturan awal. Untuk menjalankan percobaan menggunakan backend berbeda, lihat <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">Gunakan modul pengaturan lain</span></a>.</p>\n<p>Segera setelah percobaan lengkap, anda harus disambut dengan sebuah pesan yang menginformasikan anda apakah deretan percobaan lolos atau gagal. Sejak anda belum membuat perubahan apapun pada kode Django, deretan percobaan keseluruhan <strong>harus</strong> lolos. Jika anda mendapatkan kegagalan atau kesalahan pastikan anda telah mengikuti semua langkah-langkah sebelumnya dengan benar. Lihat <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/unit-tests/#running-unit-tests\"><span class=\"std std-ref\">Menjalankan satuan percobaan</span></a> untuk informasi lebih. Jika anda sedang menggunakan Python 3.5+, akan ada sepasang kegagalan pada peringatan pengusangan yang anda dapat abaikan. Kegagalan ini telah sejak diperbaiki di Django.</p>\n<p>Catat bahwa trunk Django terakhir mungkin tidak selalu stabil. Ketika mengembangkan terhadap bagasi, anda dapat memeriksa <a class=\"reference external\" href=\"https://djangoci.com\">Bangun terpadu lanjut Django</a> untuk menentukan jika kegagalan spesifik ke mesin anda atau jika mereka juga hadir di bangun resmi Django. Jika anda klik untuk melihat bangun tertentu, anda dapat melihat &quot;Konfigurasi Matrix&quot; yang menampilkkan kegagalan dibongkar oleh versi Phyton dan backend basisdata.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Untuk tutorial ini dan tiket yang kita sedang bekerja, percobaan terhadap SQLite adalah cukup, bagaimanapun, ini memungkinkan (dan terkadang butuh) untuk <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">menjalankan percobaan menggunakan basisdata berbeda</span></a>.</p>\n</aside>\n</section>\n<section id=\"creating-a-branch-for-your-patch\">\n<h2>Membuat sebuah cabang untuk tambalan anda<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>Sebelum membuat perubahan apapun, buat sebuah cabang baru untuk tiket:</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 checkout -b ticket_24788\n</code></pre></div>\n<p>Anda dapat memilih nama apapun yang anda ingin untuk cabang, &quot;ticket_24788&quot; adalah sebuah contoh. Semua perubahan dibuat di cabang ini akan dikhususkan ke tiket dan tidak akan mempengaruhi salinan utama dari kode yang kami kloning sebelumnya.</p>\n</section>\n<section id=\"writing-some-tests-for-your-ticket\">\n<h2>Menulis beberapa percobaan untuk tiket anda<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>Dalam kebanyakan kasus, untuk tambalan diterima kedalam Django dia harus disertakan percobaan. Untuk tambalan perbaikan kesalahan, ini berarti menulis percobaan pemulihan untuk memastikan bahwa kesalahan tidak pernah diperkenalkan kembali kedalam Django kemudian. Percobaan pemulihan harus ditulis dalam cara tersebut yang dia akan gagal selama kesalahan masih ada dan lulus ketika kesalahan telah diperbaiki. Untuk tambalan mengandung fitur baru, anda akan butuh menyertakan percobaan yang memastikan fitur baru bekerja dengan benar. Mereka juga akan gagal ketika fitur baru tidak hadir, dan lalu lulus ketika dia telah diterapkan.</p>\n<p>Jalan baik untuk melakukannya ini adalah pertama menulis percobaan baru anda, sebelum membuat perubahan apapun ke kode. Gaya ini dari pengembangan dipanggil <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Test-driven_development\">test-driven development</a> dan dapat diberlakukan untuk kedua proyek keseluruhan dan tambalan tunggal. Setelah menulis percobaan anda, anda kemudian jalankan mereka untuk memastikan bahwa mereka memang gagal (sejak anda belum memperbaiki kesalahan tersebut atau ditambahkan fitur tersebut). Jika percobaan baru anda tidak gagal, anda akan butuh memperbaiki mereka sehingga mereka melakukannya. Lagipula, percobaan pemulihan yang lulus tanpa memperhatikan apakah kesalahan hadir tidak sangat membantu dalam mencegah kesalahan dari terjadi di jalan.</p>\n<p>Sekarang untuk contoh meneruskan kami.</p>\n<section id=\"writing-some-tests-for-ticket-24788\">\n<h3>Menulis beberapa percobaan untuk tiket #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>Tiket <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> mengajukan tambahan fitur kecil: kemampuan untuk menentukan atribut tingkatan kelas <code class=\"docutils literal notranslate\">awalan</code> pada Bentuk kelas, sehingga:</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>Untuk menyelesaikan tiket ini, kami akan menambahkan atribut <code class=\"docutils literal notranslate\">awalan</code>  pada kelas <code class=\"docutils literal notranslate\">BaseForm</code>. Ketika membuat instance dari kelas ini, melewati awalan ke cara <code class=\"docutils literal notranslate\">__init__()</code> akan masih menyetel awalan tersebut di instance dibuat. Tetapi tidak melewatkan awalan (atai melewati <code class=\"docutils literal notranslate\">None</code>) akan menggunakan awalan tingkatan-kelas. Sebelum kami membuat perubahan tersebut, kami akan menulis sepasang percobaan untuk mengecek bahwa perubahan fungsi kami benar dan lanjut ke fungsi benar di masa datang.</p>\n<p>Arahkan ke pelipat <code class=\"docutils literal notranslate\">tests/forms_tests/tests/</code> Django dan buka berkas <code class=\"docutils literal notranslate\">test_forms.py</code>. Tambah kode berikut di baris 1674 tepat sebelum fungsi <code class=\"docutils literal notranslate\">test_forms_with_null_boolean</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=\"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=\"nc\">Person</span><span class=\"p\">(</span>Form<span class=\"p\">):</span>\n        first_name <span class=\"o\">=</span> CharField<span class=\"p\">()</span>\n        prefix <span class=\"o\">=</span> <span class=\"s1\">&#39;foo&#39;</span>\n\n    p <span class=\"o\">=</span> Person<span class=\"p\">()</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span>assertEqual<span class=\"p\">(</span>p<span class=\"o\">.</span>prefix<span class=\"p\">,</span> <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">)</span>\n\n    p <span class=\"o\">=</span> Person<span class=\"p\">(</span>prefix<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>assertEqual<span class=\"p\">(</span>p<span class=\"o\">.</span>prefix<span class=\"p\">,</span> <span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Percobaan baru ini memeriksa bahwa pengaturan awalan tingkatan kelas bekerja sesuai yang diharapkan, dan bahwa melewati parameter <code class=\"docutils literal notranslate\">awalan</code> ketika membuat sebuah instance masih bekerja juga.</p>\n<aside class=\"admonition-but-this-testing-thing-looks-kinda-hard admonition\" role=\"note\">\n<p class=\"admonition-title\">Tetapi percobaan ini terlihat sangat sulit...</p>\n<p>Jika anda tidak pernah berurusan dengan percobaan sebelumnya, mereka dapat kelihatan sedikir sulit untuk menulis pandangan pertama. Untungnya, percobaan adalah subyek <em>sangat</em> besar di pemrograman komputer, sehingga terdapat banyak informasi diluar sana:</p>\n<ul class=\"simple\">\n<li><p>Tampilan bagus pertama pada penulisan percobaan untuk Django dapat ditemukan di dokumentasi pada <a class=\"reference internal\" href=\"/id/2.0/topics/testing/overview/\"><span class=\"doc\">Menulis dan menjalankan percobaan</span></a>.</p></li>\n<li><p>Dive Into Python (sebuah buku daring bebas untuk pengembang Phyton pemula) termasuk <a class=\"reference external\" href=\"http://www.diveintopython3.net/unit-testing.html\">Perkenalan ke Unit Percobaan</a> hebat.</p></li>\n<li><p>Setelah membaca itu, jika anda ingin sesuatu sedikit daging untuk menengelamkan gigi anda kedalamnya, selalu ada dokumentasi <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(di Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">unittest</code></a> Python.</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"running-your-new-test\">\n<h3>Menjalankan percobaan baru anda<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>Ingat bahwa kita belum sebenarnya membuat perubahan apapun pada <code class=\"docutils literal notranslate\">BaseForm</code>, jadi percobaan kami akan gagal. Mari kita menjalankan semua percobaan di pelipat <code class=\"docutils literal notranslate\">forms_tests</code> untuk memastikan bahwa itu memang terjadi. Dari baris perintah, <code class=\"docutils literal notranslate\">cd</code> kedalam direktori <code class=\"docutils literal notranslate\">tests/</code> Django dan jalankan:</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 forms_tests\n</code></pre></div>\n<p>Jika percobaan berjalan dengan benar, anda harus melihat satu kegagalan terhubung dengan cara percobaan yang kita tambahkan. Jika semua percobaan lulus, lalu anda akan ingin memastikan bahwa anda menambahkan percobaan baru ke pelipat dan kelas yang sesuai.</p>\n</section>\n</section>\n<section id=\"writing-the-code-for-your-ticket\">\n<h2>Menulis kode untuk tiket anda<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>Selanjutnya kami akan menambahkan fungsi digambarkan di tiket <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> pada Django.</p>\n<section id=\"writing-the-code-for-ticket-24788\">\n<h3>Menulis kode untuk tiket #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>Navigasikan ke pelipat <code class=\"docutils literal notranslate\">django/django/forms/</code> dan buka berkas <code class=\"docutils literal notranslate\">forms.py</code>. Temukan kelas <code class=\"docutils literal notranslate\">BaseForm</code> di baris 72 dan tambah atribut kelas <code class=\"docutils literal notranslate\">awalan</code> tepat setelah atribut <code class=\"docutils literal notranslate\">field_order</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=\"nc\">BaseForm</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    field_order <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    prefix <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>memeriksa percobaan anda sekarang lulus<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>Sekali anda telah selesai merubah Django, kami butuh memastikan bahwa percobaan kami tulis sebelumnya lulus, sehingga kami dapat melihat kode kami tulis diatas bekerja dengan benar. Untuk menjalankan percobaan di pelipat <code class=\"docutils literal notranslate\">forms_tests</code>, <code class=\"docutils literal notranslate\">cd</code> kedalam direktori  <code class=\"docutils literal notranslate\">tests/</code> Django dan jalankan:</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 forms_tests\n</code></pre></div>\n<p>Ups, hal baik kami menulis percobaan tersebut! Anda harus masih melihat satu kegagalan dengan pengecualian berikut:</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>Kami lupa menambahkan pernyataan kondisi di cara <code class=\"docutils literal notranslate\">__init__</code>. Lanjutkan dan rubah <code class=\"docutils literal notranslate\">self.prefix = prefix</code> yang sekarang di baris 87 dari <code class=\"docutils literal notranslate\">django/forms/forms.py</code>, menambahkan pernyataan tambahan:</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> prefix <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>prefix <span class=\"o\">=</span> prefix\n</code></pre></div>\n<p>Jalankan-kembali percobaan dan semuanya harus lewati. Jika itu tidak, pastikan anda benar merubah kelas <code class=\"docutils literal notranslate\">BaseForm</code> seperti ditunjukkan diatas dan menyalin percobaan baru dengan benar.</p>\n</section>\n</section>\n<section id=\"running-django-s-test-suite-for-the-second-time\">\n<h2>Menjalankan rangkaian percobaan Django untuk kedua kali<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>Ketika anda telah memeriksa bahwa tambalan anda dan percobaan anda bekerja dengan benar, adalah ide bagus untuk menjalankan deretan percobaan Django keseluruhan hanya untuk menmeriksa bahwa perubahan anda tidak memunculkan kesalahan apapun kedalam kawasan lain Django. Ketika berhasil lulus deretan percobaan keseluruhan tidak menjamin kode anda bebas kesalahan, itu membantu mencirikan banyak kesalahan dan kemunduran yang mungkin tidak diketahui.</p>\n<p>Untuk menjalankan seluruh rangkaian percobaan Django, <code class=\"docutils literal notranslate\">cd</code> kedalam direktori <code class=\"docutils literal notranslate\">test/</code> Django dan jalankan:</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>Selama anda tidak melihat kegagalan apapun, anda bagus untuk berjalan.</p>\n</section>\n<section id=\"writing-documentation\">\n<h2>Menulis Dokumentasi<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>Ini adalahfitur baru, sehingga harus didokumentasikan. Tambah bagian berikut pada baris 1068 (di akhir berkas) dari <code class=\"docutils literal notranslate\">django/docs/ref/forms/api.txt</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>Sejak fitur baru ini akan berada di terbitan akan datang itu juga ditambahkan ke catatan terbitan untuk Django 1.9, di baris 164 dibawah bagian &quot;Forms&quot; di berkas <code class=\"docutils literal notranslate\">docs/releases/1.9.txt</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>Untuk informasi lebih dalam menulis dokumen, termasuk penjelasan dari apa semua tentang bit <code class=\"docutils literal notranslate\">versionadded</code>, lihat <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-documentation/\"><span class=\"doc\">Menulis dokumentasi</span></a>. Halaman itu juga menyertakan sebuah penjelasan dari bagaimana membangun salinan dari dokumentasi secara lokal, sehingga anda dapat meninjau HTML yang akan dibangkitkan.</p>\n</section>\n<section id=\"previewing-your-changes\">\n<h2>Pratinjau perubahan anda<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>Sekarang waktunya pergi melalui semua perubahan dibuat di tambalan kami. Untuk memperlihatkan perbedaan diantara salinan anda saat ini dari Django (dengan perubahan anda) dan pembetulan yang anda mulanya diperiksa lebih awal di tutorial:</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 diff\n</code></pre></div>\n<p>Gunakan kunci panah untuk pindah ke atas dan ke bawah.</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:</span>\n     # information. Any improvements to the form API should be made to *this*\n     # class, not to the Form class.\n     field_order = None\n<span class=\"gi\">+    prefix = None</span>\n\n     def __init__(self, data=None, files=None, auto_id=&#39;id_%s&#39;, prefix=None,\n                  initial=None, error_class=ErrorList, label_suffix=None,\n<span class=\"gu\">@@ -83,7 +84,8 @@ class BaseForm:</span>\n         self.data = data or {}\n         self.files = files or {}\n         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         self.initial = initial or {}\n         self.error_class = error_class\n         # 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     &gt;&gt;&gt; print(father.as_ul())\n     &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     &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   :attr:`~django.forms.Form.field_order` attribute, the ``field_order``\n   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 Generic Views\n ^^^^^^^^^^^^^\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         self.assertEqual(p.cleaned_data[&#39;last_name&#39;], &#39;Lennon&#39;)\n         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     def test_forms_with_null_boolean(self):\n         # NullBooleanField is a bit of a special case because its presentation (widget)\n         # is different than its data. This is handled transparently, though.\n</code></pre></div>\n<p>Ketika anda selesai meninjau tambalan, kenai kunci <code class=\"docutils literal notranslate\">q</code> untuk kembali ke baris perintah. Jika isi tambalan terlihat oke, waktunya memperbaiki perubahan.</p>\n</section>\n<section id=\"committing-the-changes-in-the-patch\">\n<h2>Memperbaiki perubahan di tambalan<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>Memperbaiki perubahan:</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 commit -a\n</code></pre></div>\n<p>Ini membuka penyunting teks untuk mengetik pesanperbaikan. Ikuti <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">commit message guidelines</span></a> dan tulis sebuah pesan seperti:</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>Mendorong perbaikan dan membuat sebuah pull request<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>Setelah memperbaiki tambalan, kirim itu ke garpu pada GitHub (ganti &quot;ticket_24788&quot; dengan nama dari cabang anda jika itu berbeda):</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 push origin ticket_24788\n</code></pre></div>\n<p>Anda dapat membuat sebuah pull request dengan mengunjungi <a class=\"reference external\" href=\"https://github.com/django/django/\">Django GitHub page</a>. Anda akan melihat cabang anda dibawah &quot;Your recently pushed branches&quot;. Klik &quot;Compare &amp; pull request&quot; dekatnya.</p>\n<p>Harap jangan melakukan itu untuk tutorial ini. tetapi pada halaman selanjutnya yang memperlihatkan tinjauan dari tambalan, anda akan mengklik &quot;Create pull request&quot;.</p>\n</section>\n<section id=\"next-steps\">\n<h2>Langkah-langkah selanjutnya<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>Selamat, anda telah belajar bagaimana membuat sebuah pull request pada Django! Rincian dari teknik-teknik lebih lanjut anda mungkin butuh adalah di <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Bekerja dengan Git dan GitHub</span></a>.</p>\n<p>Sekarang anda dapat menaruh keahlian-keahlian tersebut untuk penggunaan bagus dengan membantu memperbaiki kode dasar Django.</p>\n<section id=\"more-information-for-new-contributors\">\n<h3>Informasi lebih untuk penyumbang baru<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>Sebelum anda terlalu kedalam menulis tambalan untuk Django, terdapat sedikit informasi lebih di bantuan yang anda harus mungkin lihat pada:</p>\n<ul class=\"simple\">\n<li><p>Anda harus pastikan membaca dokumentasi Django di <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">claiming tickets and submitting patches</span></a>. Itu melingkup tata cara Trac, bagaimana menyatakan tiket untuk anda sendiri, gaya pengkodean yang diharapkan untuk tambalan, dan banyak rincian penting lain.</p></li>\n<li><p>Pertama kali penyumbang harus juga membaca <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/new-contributors/\"><span class=\"doc\">documentation for first time contributors</span></a>. Django. Itu mempunyai banyak saran baik untuk siapa dari kita yang baru untuk dibantu dengan Django.</p></li>\n<li><p>Setelah itu, jika anda masih terburu-buru untuk informasi lebih tentang bantuan, anda dapat selalu menjelajah melalui sisa <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/\"><span class=\"doc\">Django's documentation on contributing</span></a>. Itu mengandung ton dari informasi berguna dan harus menjadi sumber pertama anda untuk menjawab pertanyaan papun anda mungkin punya.</p></li>\n</ul>\n</section>\n<section id=\"finding-your-first-real-ticket\">\n<h3>Temukan tiket sungguhan pertama anda<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>Ketika anda telah mencari beberapa informasi itu, anda akan siap keluar dan menemukan tiket dari milik anda untuk menulis tambalan. Perhatian khusus ke tiket dengan standar &quot;pemetikan mudah&quot;. Tiket ini sering banyak sederhana di alam dan hebat untuk pertama kali penyumbang. Ketika anda akrab dengan membantu ke Django, anda dapat pindah ke menulis tambalan untuk tiket lebih sulit dan rumit.</p>\n<p>Jika anda hanya ingin segera mulai (dan tidak siapapun akan menyalahkan anda!), coba lihatlah daftar dari <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\">easy tickets that need patches</a> dan <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\">easy tickets that have patches which need improvement</a>. Jika anda akrab dengan menulis percobaan, anda dapat juga melihat daftar <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\">easy tickets that need tests</a>. Hanya ingat untuk mengikuti panduan berikut tentang menyatakan tiket yang disebutkan di tautan pada dokumentasi Django di <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">claiming tickets and submitting patches</span></a>.</p>\n</section>\n<section id=\"what-s-next-after-creating-a-pull-request\">\n<h3>Apa selanjutnya setelah membuat sebuah pull request?<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>Setelah tiket mempunyai tambalan, itu butuh ditinjau dengan sekumpulan mata kedua. Setelah mengajukan permintaan penarikan, perbaharui metadata tiket dengan mengatur bendera di tiket untuk mengatakan &quot;punya tambalan&quot;, &quot;tidak butuh percobaan&quot;, dll, sehingga lainnya dapat menemukannya untuk ditinjau. Membantu tidak perlu selalu berarti menulis tambalan dari awal. Meninjau tambalan yang ada juga sangat membantu. Lihat <a class=\"reference internal\" href=\"/id/2.0/internals/contributing/triaging-tickets/\"><span class=\"doc\">Mendahulukan tiket</span></a> untuk rinci.</p>\n</section>\n</section>","rootId":"writing-your-first-patch-for-django","toc":[{"title":"Kata Pengantar","anchor":"introduction","children":[{"title":"Untuk siapa saja tutorial ini?","anchor":"who-s-this-tutorial-for","children":[]},{"title":"Tutorial ini meliputi apa?","anchor":"what-does-this-tutorial-cover","children":[]}]},{"title":"Kode Etik","anchor":"code-of-conduct","children":[]},{"title":"Memasang Git","anchor":"installing-git","children":[]},{"title":"Mendapatkan salinan versi pengembangan Django","anchor":"getting-a-copy-of-django-s-development-version","children":[]},{"title":"Gulir kembali ke perubahan sebelum dari Django","anchor":"rolling-back-to-a-previous-revision-of-django","children":[]},{"title":"Menjalankan rangkaian percobaan Django untuk pertama kali","anchor":"running-django-s-test-suite-for-the-first-time","children":[]},{"title":"Membuat sebuah cabang untuk tambalan anda","anchor":"creating-a-branch-for-your-patch","children":[]},{"title":"Menulis beberapa percobaan untuk tiket anda","anchor":"writing-some-tests-for-your-ticket","children":[{"title":"Menulis beberapa percobaan untuk tiket #24788","anchor":"writing-some-tests-for-ticket-24788","children":[]},{"title":"Menjalankan percobaan baru anda","anchor":"running-your-new-test","children":[]}]},{"title":"Menulis kode untuk tiket anda","anchor":"writing-the-code-for-your-ticket","children":[{"title":"Menulis kode untuk tiket #24788","anchor":"writing-the-code-for-ticket-24788","children":[]},{"title":"memeriksa percobaan anda sekarang lulus","anchor":"verifying-your-test-now-passes","children":[]}]},{"title":"Menjalankan rangkaian percobaan Django untuk kedua kali","anchor":"running-django-s-test-suite-for-the-second-time","children":[]},{"title":"Menulis Dokumentasi","anchor":"writing-documentation","children":[]},{"title":"Pratinjau perubahan anda","anchor":"previewing-your-changes","children":[]},{"title":"Memperbaiki perubahan di tambalan","anchor":"committing-the-changes-in-the-patch","children":[]},{"title":"Mendorong perbaikan dan membuat sebuah pull request","anchor":"pushing-the-commit-and-making-a-pull-request","children":[]},{"title":"Langkah-langkah selanjutnya","anchor":"next-steps","children":[{"title":"Informasi lebih untuk penyumbang baru","anchor":"more-information-for-new-contributors","children":[]},{"title":"Temukan tiket sungguhan pertama anda","anchor":"finding-your-first-real-ticket","children":[]},{"title":"Apa selanjutnya setelah membuat sebuah pull request?","anchor":"what-s-next-after-creating-a-pull-request","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Mulai","url":"/id/2.0/intro/"}],"prev":{"docname":"intro/whatsnext","title":"Apa yang akan dibaca selanjutnya","url":"/id/2.0/intro/whatsnext/"},"next":{"docname":"topics/index","title":"Menggunakan Django","url":"/id/2.0/topics/"},"formats":{"html":"/id/2.0/intro/contributing/","markdown":"/id/2.0/intro/contributing.md","json":"/id/2.0/intro/contributing.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/intro/contributing.txt","official":"https://docs.djangoproject.com/id/2.0/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","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}