{"title":"Menulis tambalan pertama anda untuk Django","version":"1.9","locale":"id","docname":"intro/contributing","url":"/id/1.9/intro/contributing/","canonical":"https://djangodocs.dev/id/1.9/intro/contributing/","summary":"Tertarik dalam memberikan kembali ke komunitas sedikit? Mungkin anda telah menemukan kesalahan di Django yang anda ingin melihat diperbaiki, atau mungkin…","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 dalam memberikan kembali ke komunitas sedikit? Mungkin anda telah menemukan kesalahan di Django yang anda ingin melihat diperbaiki, atau mungkin terdapat fitur baru yang anda ingin 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/1.9/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/1.9/intro/tutorial01/\"><span class=\"doc\">menulis aplikasi Django pertama anda</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/1.9/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>Membangkitkan berkas tambalan untuk perubahan anda.</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 <a class=\"reference internal\" href=\"/id/1.9/internals/contributing/\"><span class=\"doc\">Dokumentasi Django pada menyumbang</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>Tutorial ini menganggap anda menggunakan Phyton 3. Dapatkan versi terakhir di <a class=\"reference external\" href=\"https://www.python.org/download/\">Halaman unduh Python</a> atau dengan pengelola paket sistem operasi anda.</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 class=\"reference external\" href=\"https://www.djangoproject.com/conduct/\">Kode Etik</a> 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=\"http://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 salinan dari sumber kode. Dari baris perintah, gunakan perintah <code class=\"docutils literal notranslate\">cd</code> untuk mengarah ke direktori dimana anda akan ingin salinan lokal Django berjalan.</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 https://github.com/django/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\">penyerahan 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\">penyerahan4ccfc4439a7add24f8db4ef3960d02ef8ae09887</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>Sekarang kita siap menjalankan deretan percobaan. Jika anda menggunakan GNU/Linux, Mac OS X 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>Percobaan dilewati merupakan khas karena kehilangan pustaka eksternal yang dibutuhkan untuk menjalankan percobaan; lihat <a class=\"reference internal\" href=\"/id/1.9/internals/contributing/writing-code/unit-tests/#running-unit-tests-dependencies\"><span class=\"std std-ref\">Running all the tests</span></a> untuk daftar ketergantungan dan pastikan memasang apapun untuk percobaan pada perubahan anda buat (kami tidak akan butuh untuk tutorial ini).</p>\n<p>Once the tests complete, you should be greeted with a message informing you\nwhether the test suite passed or failed. Since you haven't yet made any changes\nto Django's code, the entire test suite <strong>should</strong> pass. If you get failures or\nerrors make sure you've followed all of the previous steps properly. See\n<a class=\"reference internal\" href=\"/id/1.9/internals/contributing/writing-code/unit-tests/#running-unit-tests\"><span class=\"std std-ref\">Menjalankan satuan percobaan</span></a> for more information. If you're using Python 3.5+,\nthere will be a couple failures related to deprecation warnings that you can\nignore. These failures have since been fixed in 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=\"http://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/1.9/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=\"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/1.9/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.diveintopython.net/unit_testing/index.html\">Perkenalan ke Unit Percobaan</a> hebat.</p></li>\n<li><p>After reading those, if you want something a little meatier to sink\nyour teeth into, there's always the Python <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> documentation.</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> ke 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><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    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/1.9/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=\"generating-a-patch-for-your-changes\">\n<h2>Membangkitkan tambalan untuk perubahan anda<a class=\"heading-anchor\" href=\"#generating-a-patch-for-your-changes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sekarang waktunya membangkitkan berkas tambalan yang dapat diunggah untuk Trac atau diberlakukan ke salinan Django lainnya. Untuk mendapatkan melihat isi dari tambalan anda, jalankan 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 diff\n</code></pre></div>\n<p>Ini akan menampilkan perbedaan diantara salinan saat ini Django (dengan perubahan anda) dan versi yang anda pertama periksa sebelumnya di tutorial.</p>\n<p>Sekali anda telah selesai mencari tambalan, pukul kunci <code class=\"docutils literal notranslate\">q</code> untuk keluar kembali ke baris perintah. Jika isi tambalan terlihat oke, anda dapat menjalankan perintah berikut untuk menyimpan berkas tambalan ke direktori pekerjaan saat ini:</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 &gt; <span class=\"m\">24788</span>.diff\n</code></pre></div>\n<p>Anda harus mempunyai berkas di akar direktori Django disebut <code class=\"docutils literal notranslate\">24788.diff</code>. Berkas tambalan ini mengandung semua perubahan anda dan harus seperti ini:</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     # 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(object):</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</section>\n<section id=\"so-what-do-i-do-next\">\n<h2>Jadi apa yang Saya lakukan selanjutnya?<a class=\"heading-anchor\" href=\"#so-what-do-i-do-next\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Selamat, anda telah membangkitkan tambalan Django pertama anda! Sekarang bahwa anda telah mendapatkannya dibawah sabuk anda, anda dapat menaruh keahlian tersebut dengan baik untuk memperbaiki basiskode Django. Membangkitkan tambalan dan lampirankan mereka ke tiket Trac sangat berguna, bagaimanapun, sejak kami menggunakan git - mengadopsi lebih <a class=\"reference internal\" href=\"/id/1.9/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">alurkerja orientasi git</span></a> sangat disarankan.</p>\n<p>Sejak kami tidak perbah menyerahkan perubahan secara lokal, lakukan berikut untuk mendapatkan cabang got kembali untuk titik awal yang baik:</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 reset --hard HEAD\n<span class=\"gp\">$ </span>git checkout master\n</code></pre></div>\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/1.9/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">menyatakan tiket dan mengajukan tambalan</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/1.9/internals/contributing/new-contributors/\"><span class=\"doc\">dokumentasi untuk penyumbang pertama kali</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/1.9/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\">tiket mudah yang butuh tambalan</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\">tiket mudah yang mempunyai tambalan yang butuh perbaikan</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\">tiket mudah yang butuh percobaan</a>. Hanya ingat untuk mengikuti panduanberikut tentang menyatakan tiket yang disebutkan di tautan pada dokumentasi Django di <a class=\"reference internal\" href=\"/id/1.9/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">menyatakan tiket dan mengajukan tambalan</span></a>.</p>\n</section>\n<section id=\"what-s-next\">\n<h3>Apa Selanjutnya?<a class=\"heading-anchor\" href=\"#what-s-next\"><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 mengunggah tambalan atau mengajukan permintaan penarikan, pastikan untuk memperbaharui 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 berartu menulis tambalan dari awal. Meninjau tambalan yang ada juga sangat membantu. Lihat <a class=\"reference internal\" href=\"/id/1.9/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":"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":"Membangkitkan tambalan untuk perubahan anda","anchor":"generating-a-patch-for-your-changes","children":[]},{"title":"Jadi apa yang Saya lakukan selanjutnya?","anchor":"so-what-do-i-do-next","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?","anchor":"what-s-next","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Mulai","url":"/id/1.9/intro/"}],"prev":{"docname":"intro/whatsnext","title":"Apa yang akan dibaca selanjutnya","url":"/id/1.9/intro/whatsnext/"},"next":{"docname":"topics/index","title":"Menggunakan Django","url":"/id/1.9/topics/"},"formats":{"html":"/id/1.9/intro/contributing/","markdown":"/id/1.9/intro/contributing.md","json":"/id/1.9/intro/contributing.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/intro/contributing.txt","official":"https://docs.djangoproject.com/id/1.9/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","fr","ja","id","pt-br","es"]}