{"title":"Tutorial lanjut: Bagaimana menulis aplikasi digunakan kembali","version":"2.2","locale":"id","docname":"intro/reusable-apps","url":"/id/2.2/intro/reusable-apps/","canonical":"https://djangodocs.dev/id/2.2/intro/reusable-apps/","summary":"Tutorial lanjutan ini mulai dimana Tutorial 7 ditinggalkan. Kami akan merubah jejak pendapat Jaringan kami kedalam paket Python berdisi sendiri anda dapat gunakan…","html":"<h1>Tutorial lanjut: Bagaimana menulis aplikasi digunakan kembali<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Tutorial lanjutan ini mulai dimana <a class=\"reference internal\" href=\"/id/2.2/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a> ditinggalkan. Kami akan merubah jejak pendapat Jaringan kami kedalam paket Python berdisi sendiri anda dapat gunakan kembali dalam proyek baru dan berbagi dengan orang lain.</p>\n<p>Jika anda belum melengkapi Tutorial 1–7, kami mendorong anda meninjau ini sehingga proyek contoh anda cocok satu yang digambarkan dibawah.</p>\n<section id=\"reusability-matters\">\n<h2>Hal-hal dapat digunakan kembali<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Adalah pekerjaan banyak untuk merancang, membangun, mencoba dan merawat aplikasi jaringan. Banyak proyek Phyton dan Django berbagi masalah umum. Bukankah bagus jika kami dapat menyimpan beberapa pekerjaan berulang ini?</p>\n<p>Penggunaan kembali adaah cara hidup dalam Python. <a class=\"reference external\" href=\"https://pypi.org/\">The Python Package Index (PyPI)</a> mempunyai jangkauan luas dari paket-paket anda dapat gunakan dalam program-program Python milik anda. Periksa <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> untuk keadaan aplikasi-aplikasi digunakan kembali anda dapat pakai dalam proyek anda. Django itu sendiri hanya sebuah  paket Python. Ini berarti bahwa anda dapat mengambil paket-paket Python yang ada atai aplikasi-aplikasi Django dan menyusun mereka kedalam proyek jaringan milik anda. Anda hanya butuh menulis bagian-bagian yang membuat proyek anda unik.</p>\n<p>Let's say you were starting a new project that needed a polls app like the one\nwe've been working on. How do you make this app reusable? Luckily, you're well\non the way already. In <a class=\"reference internal\" href=\"/id/2.2/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a>, we saw how we\ncould decouple polls from the project-level URLconf using an <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code>.\nIn this tutorial, we'll take further steps to make the app easy to use in new\nprojects and ready to publish for others to install and use.</p>\n<aside class=\"admonition-package-app admonition\">\n<p class=\"admonition-title\">Paket? Aplikasi?</p>\n<p><a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(di Python v3.14)\"><span class=\"xref std std-term\">package</span></a> Python menyediakan cara pengelompokkan terhubung kode Python untuk memudahkan penggunaan kembali. Sebuah paket mengandung satu atau lebih berkas dari kode Python (juga dikenal sebagai &quot;modul&quot;).</p>\n<p>Sebuah paket dapat diimpor dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">foo.bar</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">foo</span> <span class=\"pre\">import</span> <span class=\"pre\">bar</span></code>. Untuk direktori (seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>) untuk membentuk paket, dia harus mengandung berkas khusus <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code>, bahkan jika berkas ini kosong.</p>\n<p>Sebuah <em>aplikasi</em> Django hanya sebuah paket Phyton yang khususnya dimaksudkan untuk digunakan di proyek Django. Sebuah aplikasi mungkin menggunakan kebiasaan Django umum, seperti mempunyai submodul <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">percobaan</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">url</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">tampilan</span></code>.</p>\n<p>Kemudian kami menggunakan istilah <em>pemaketan</em> untuk menggambarkan pengolahan dalam membuat paket Phyton mudah untuk lainnya untuk dipasang. Dia dapat sedikit membingungkan, kami tahu.</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>Proyek anda dan aplikasi digunakan kembali anda<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Setelah tutorial sebelumnya, proyek kami harusnya seperti ini:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">mysite</span><span class=\"o\">/</span>\n    <span class=\"n\">manage</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">mysite</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">wsgi</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">polls</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">migrations</span><span class=\"o\">/</span>\n            <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n            <span class=\"mi\">0001</span><span class=\"n\">_initial</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">static</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">images</span><span class=\"o\">/</span>\n                    <span class=\"n\">background</span><span class=\"o\">.</span><span class=\"n\">gif</span>\n                <span class=\"n\">style</span><span class=\"o\">.</span><span class=\"n\">css</span>\n        <span class=\"n\">templates</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">detail</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">index</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">results</span><span class=\"o\">.</span><span class=\"n\">html</span>\n        <span class=\"n\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">templates</span><span class=\"o\">/</span>\n        <span class=\"n\">admin</span><span class=\"o\">/</span>\n            <span class=\"n\">base_site</span><span class=\"o\">.</span><span class=\"n\">html</span>\n</code></pre></div>\n<p>Anda membuat <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/template</span></code> di doc:Tutorial 7 &lt;/intro/tutorial07&gt;`, dan <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>polls/templates` di :doc: Tutorial 3 &lt;/intro/tutorial03&gt;`. Sekarang tampak lebih jelas mengapa kita memilih direktori templat yang berbeda untuk project dan aplikasi: semua yang merupakan bagian aplikasi polls di dalam <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>polls`. Hal ini membuat aplikasi berdiri-sendiri dan lebih mudah untuk membuat projek baru.</p>\n<p>Direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> sekarang dapat disalin kedalam proyek Django baru dan segera digunakan kembali. Dia tidak siap untuk diterbitkan. Untuk itu, kami butuh untuk memaketkan aplikasi agar membuatnya mudah untuk lainnya dipasang.</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>Memasang beberapa prasyarat<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Keadaan saat ini dari pemaketan Phyton adalah sedikit karut dengan alat beragam. Untuk tutorial ini, kami akan menggunakan <a class=\"reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a> untuk membangun paket kami. Ini adalah alat pemaketan disarankan (digabungkan dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">mengedarkan</span></code> cabang). Kami akan juga menggunakan <a class=\"reference external\" href=\"https://pypi.org/project/pip/\">pip</a> untuk memasan dan melepasnya. Anda harus memasang dua paket ini sekarang. Jika anda butuh bantuan, anda dapat mengacu ke <a class=\"reference internal\" href=\"/id/2.2/topics/install/#installing-official-release\"><span class=\"std std-ref\">how to install Django with pip</span></a>. Anda dapat memasang <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code> cara sama.</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>Memaketkan aplikasi anda<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><em>Pemaketan</em> Phyton mengacu pada menyiapkan aplikasi anda di bentuk khusus yang dapat mudah dipasang dan digunakan. Django itu sendiri dipaketkan seperti ini. Untuk aplikasi jecil seperti jejak pendapat, pengolahan ini tidak terlalu sulit.</p>\n<ol class=\"arabic\">\n<li><p>Pertama, buat direktori induk untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>, diluar dari proyek Django anda. Panggil direktori ini <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>.</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\">\n<p class=\"admonition-title\">Memilih nama dari aplikasi anda</p>\n<p>Ketika memilih nama untuk paket anda, periksa sumber daya seperti PyPI untuk menghindari penamaan bertentangan dengan paket yang anda. Ini sering berguna untuk menambahkan <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code> ke nama modul ketika membuat paket untuk dibagikan. Ini membantu lainnya mencari aplikasi Django mencirikan aplikasi anda sebagai khas Django.</p>\n<p>Label aplikasi (yaitu, bagian akhir dari jalur bertitik ke paket aplikasi) <em>harus</em> unik di <a class=\"reference internal\" href=\"/id/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>. Hindari menggunakan label sama seperti Django <a class=\"reference internal\" href=\"/id/2.2/ref/contrib/\"><span class=\"doc\">contrib packages</span></a>, sebagai contoh <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code>, or <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code>.</p>\n</aside>\n</li>\n<li><p>Pindahkan direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">poll</span></code> kedalam direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>.</p></li>\n<li><p>Buat berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code> dengan isi berikut:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"rst\"><figcaption class=\"code-block-caption\">django-polls/README.rst</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">=====</span>\n<span class=\"gh\">Polls</span>\n<span class=\"gh\">=====</span>\n\nPolls is a simple Django app to conduct Web-based polls. For each\nquestion, visitors can choose between a fixed number of answers.\n\nDetailed documentation is in the &quot;docs&quot; directory.\n\n<span class=\"gh\">Quick start</span>\n<span class=\"gh\">-----------</span>\n\n<span class=\"m\">1.</span> Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n<span class=\"c\">        ...</span>\n<span class=\"c\">        &#39;polls&#39;,</span>\n<span class=\"c\">    ]</span>\n\n<span class=\"m\">2.</span> Include the polls URLconf in your project urls.py like this::\n\n    path(&#39;polls/&#39;, include(&#39;polls.urls&#39;)),\n\n<span class=\"m\">3.</span> Run <span class=\"nv\">`python manage.py migrate`</span> to create the polls models.\n\n<span class=\"m\">4.</span> Start the development server and visit http://127.0.0.1:8000/admin/\n   to create a poll (you&#39;ll need the Admin app enabled).\n\n<span class=\"m\">5.</span> Visit http://127.0.0.1:8000/polls/ to participate in the poll.\n</code></pre></figure>\n</li>\n<li><p>Buat berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/LICENSE</span></code>. Memilih lisensi diluar lingkup dari tutorial ini, tetapi mencukupinya untuk dikatakan bahwa kode diterbitkan umum tanpa lisensi adalah <em>tidak berguna</em>. Django dan banyak aplikasi Sesuai-Django disebarkan dibawah lisensi BSD; bagaimanapun, anda bebas mengambil lisensi anda sendiri. Hanya waspada bahwa pilihan lisensi anda akan mempengaruhi siapa yang dapat menggunakan kode anda.</p></li>\n<li><p>Next we'll create <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.cfg</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.py</span></code> files which detail how to\nbuild and install the app. A full explanation of these files is beyond the\nscope of this tutorial, but the <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">setuptools documentation</a> has a good explanation.\nCreate the files <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.cfg</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code>\nwith the following contents:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"ini\"><figcaption class=\"code-block-caption\">django-polls/setup.cfg</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</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=\"Ini code\"><code><span class=\"k\">[metadata]</span>\n<span class=\"na\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">django-polls</span>\n<span class=\"na\">version</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">0.1</span>\n<span class=\"na\">description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">A Django app to conduct Web-based polls.</span>\n<span class=\"na\">long_description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">file: README.rst</span>\n<span class=\"na\">url</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">https://www.example.com/</span>\n<span class=\"na\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">Your Name</span>\n<span class=\"na\">author_email</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">yourname@example.com</span>\n<span class=\"na\">license</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">BSD-3-Clause</span><span class=\"w\">  </span><span class=\"c1\"># Example license</span>\n<span class=\"na\">classifiers</span><span class=\"w\"> </span><span class=\"o\">=</span>\n<span class=\"w\">    </span><span class=\"na\">Environment</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Web Environment</span>\n<span class=\"w\">    </span><span class=\"na\">Framework</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Django</span>\n<span class=\"w\">    </span><span class=\"na\">Framework</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Django :: X.Y</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"w\">    </span><span class=\"na\">Intended Audience</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Developers</span>\n<span class=\"w\">    </span><span class=\"na\">License</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: OSI Approved :: BSD License</span>\n<span class=\"w\">    </span><span class=\"na\">Operating System</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: OS Independent</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3 :: Only</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.6</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.7</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.8</span>\n<span class=\"w\">    </span><span class=\"na\">Topic</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP</span>\n<span class=\"w\">    </span><span class=\"na\">Topic</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP :: Dynamic Content</span>\n\n<span class=\"k\">[options]</span>\n<span class=\"na\">include_package_data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">true</span>\n<span class=\"na\">packages</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">find:</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">django-polls/setup.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">setuptools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">setup</span>\n\n <span class=\"n\">setup</span><span class=\"p\">()</span>\n</code></pre></figure>\n</li>\n<li><p>Hanya modul dan paket Phyton yang disertakan dalam paket secara awal. Untuk menyertakan berkas tambahan, kami akan butuh membuat berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code>. Dokumentasi alat pengaturan mengacu di langkah sebelumnya obrolkan berkas ini lebih rinci. Untuk menyertakan cetakan, berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">README.rst</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">LICENSE</span></code> kami, membuat sebuah berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> dengan isi berikut:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\">django-polls/MANIFEST.in</figcaption>\n<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>include LICENSE\ninclude README.rst\nrecursive-include polls/static *\nrecursive-include polls/templates *\n</code></pre></figure>\n</li>\n<li><p>Ini adalah pilihan, tetapi disarankan, untuk menyertakan dokumentasi rinci dengan aplikasi anda. Buat direktori kosong <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/docs</span></code> untuk dokumentasi akan datang. Tambah sebuah tambahan baris pada <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">docs</span> <span class=\"o\">*</span>\n</code></pre></div>\n<p>Catat bahwa direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">docs</span></code> tidak akan disertakan dalam paket anda meskipun anda menambahkan beberapa berkas ke dalamnya. Banyak aplikasi Django juga menyediakan dokumentasi darin mereka melalui situs seperti <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a>.</p>\n</li>\n<li><p>Coba membangun paket anda dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">setup.py</span> <span class=\"pre\">sdist</span></code> (jalankan dari dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>). Ini membuat direktori dipanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">dist</span></code> dan bangun paket baru anda, <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls-0.1.tar.gz</span></code>.</p></li>\n</ol>\n<p>For more information on packaging, see Python's <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Tutorial on Packaging and\nDistributing Projects</a>.</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>Menggunakan paket anda sendiri<a class=\"heading-anchor\" href=\"#using-your-own-package\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sejak kami memindahkan direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> diluar proyek, dia tidak lagi bekerja. Kami akan sekarang memperbaiki ini dengan memasang paket <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> baru.</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\">\n<p class=\"admonition-title\">Memasang sebagai pustaka pengguna</p>\n<p>Langkah berikut memasang <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> sebagai pustaka pengguna. Tiap-pengguna pasang mempunyai banyak keuntungan lebih memasang paket lebar-sistem, seperti menjadi berguna di sistem dimana anda tidak mempunyai akses administrator sama halnya mencegah paket dari layanan sistem terpengaruh dan pengguna lain dari mesin.</p>\n<p>Catat bahwa pemasangan per-pengguna dapat masih mempengaruhi kebiasaan alat sistem yang berjalan sebagai pengguna tersebut, jadi <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code> adalah pemecahan lebih kuat (lihat dibawah).</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>Untuk memasang paket, gunakan pip (anda sudah <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">memasangnya</span></a>, benar?):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">pip</span> <span class=\"n\">install</span> <span class=\"o\">--</span><span class=\"n\">user</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">dist</span><span class=\"o\">/</span><span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">-</span><span class=\"mf\">0.1</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n</code></pre></div>\n</li>\n<li><p>Dengan keberuntungan, proyek Django anda seharusnya sekarang bekerja dengan benar kembali. Jalankan peladen kembali untuk menegaskan ini.</p></li>\n<li><p>Untuk melepas paket. gunakan pip:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">pip</span> <span class=\"n\">uninstall</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span>\n</code></pre></div>\n</li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>Keluarkan aplikasi anda<a class=\"heading-anchor\" href=\"#publishing-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sekarang bahwa kita telah memaketkan dan mengujikan <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>, dia sudah siap dibagi dengan dunia! Jika ini bukan contoh, anda dapat melakukannya sekarang:</p>\n<ul class=\"simple\">\n<li><p>Surel paket ke teman.</p></li>\n<li><p>Unggah paket di situs jaringan anda.</p></li>\n<li><p>Tempatkan paket pada gudang umum, seperti <a class=\"reference external\" href=\"https://pypi.org/\">the Python Package Index (PyPI)</a>. <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> mempunyai <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">a good tutorial</a> untuk melakukan ini.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-virtualenv\">\n<h2>Memasang paket Phyton dengan virtualenv<a class=\"heading-anchor\" href=\"#installing-python-packages-with-virtualenv\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sebelumnya, kami memasalang aplikasi poling sebagai pustaka pengguna. Ini mempunyai beberapa kerugian:</p>\n<ul class=\"simple\">\n<li><p>Merubah pustaka pengguna dapat berakibat perangkat lunak Phyton lain di sistem anda.</p></li>\n<li><p>Anda tidak dapat menjalankan versi banyak dari paket ini (atau lainnya dengan nama sama disini).</p></li>\n</ul>\n<p>Khususnya, keadaan ini hanya muncul sekali anda sedang merawat beberapa proyek Django. Ketike mereka melakukan, pemecahan terbaik adalah menggunakan <a class=\"reference external\" href=\"https://virtualenv.pypa.io/\">virtualenv</a>. Alat ini mengizinkan anda untuk merawat banyak lingkungan Python terpencil, masing-masing dengan salinan itu sendiri dari pustaka dan paket namespace.</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"Hal-hal dapat digunakan kembali","anchor":"reusability-matters","children":[]},{"title":"Proyek anda dan aplikasi digunakan kembali anda","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"Memasang beberapa prasyarat","anchor":"installing-some-prerequisites","children":[]},{"title":"Memaketkan aplikasi anda","anchor":"packaging-your-app","children":[]},{"title":"Menggunakan paket anda sendiri","anchor":"using-your-own-package","children":[]},{"title":"Keluarkan aplikasi anda","anchor":"publishing-your-app","children":[]},{"title":"Memasang paket Phyton dengan virtualenv","anchor":"installing-python-packages-with-virtualenv","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Mulai","url":"/id/2.2/intro/"}],"prev":{"docname":"intro/tutorial07","title":"Menulis aplikasi Django kedua anda, bagian 7","url":"/id/2.2/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"Apa yang akan dibaca selanjutnya","url":"/id/2.2/intro/whatsnext/"},"formats":{"html":"/id/2.2/intro/reusable-apps/","markdown":"/id/2.2/intro/reusable-apps.md","json":"/id/2.2/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/id/2.2/intro/reusable-apps/","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"]}