{"title":"Tutorial lanjut: Bagaimana menulis aplikasi digunakan kembali","version":"5.0","locale":"id","docname":"intro/reusable-apps","url":"/id/5.0/intro/reusable-apps/","canonical":"https://djangodocs.dev/id/5.0/intro/reusable-apps/","summary":"This advanced tutorial begins where Tutorial 8 left off. We'll be turning our web-poll into a standalone Python package you can reuse in new projects and share with…","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>This advanced tutorial begins where <a class=\"reference internal\" href=\"/id/5.0/intro/tutorial08/\"><span class=\"doc\">Tutorial 8</span></a>\nleft off. We'll be turning our web-poll into a standalone Python package\nyou can reuse in new projects and share with other people.</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>Dapat digunakan kembali adalah cara hidup  dalam Python. <a class=\"reference external\" href=\"https://pypi.org/\">The Python Package Index (PyPI)</a> memiliki jangkauan luas dari paket-paket anda dapat gunakan dalam program Python anda. Periksa <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> untuk aplikasi-aplikasi yang dapat digunakan kembali yang anda anda dapat bekerjasama dalam proyek anda. Django itu sendiri merupakan paket biasa Python. Ini berarti bahwa anda dapat mengambil paket Python yang ada atau aplikasi Django dan menyusun mereka kedalam proyek jaringan anda sendiri. Anda hanya butuh menulis bagian yang membuat proyek anda unik.</p>\n<p>Mari kita katakan anda sedang memulai proyek baru yang butuh aplikasi jejak pendapat seperti satu yang kite telah kerjakan. Bagaimana anda ingin membuat aplikasi ini dapat digunakan kembali? Untungnya, anda sudah sedang dalam perjalanan. Dalam <a class=\"reference internal\" href=\"/id/5.0/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a>, kai lihat bagaimana kami dapat memisahkan jejak pendapat dari URLconf tingkat-proyek menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code>. Dalam tutorial ini, kami akan mengambil langkah lebih jauh untuk membuat aplikasi lebih mudah digunakan dalam proyek baru dan siap untuk diterbitkan untuk lainnya untuk dipasang dan digunakan.</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 adalah sebuah paket Python yang khususnya diperuntukkan untuk penggunaan dalam sebuah proyek Django. Sebuah aplikasi mungkin menggunakan kebiasaan umum Django, seperti memiliki submodul <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">urls</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">views</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>After the previous tutorials, our project should look like this:</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>mysite/\n    manage.py\n    mysite/\n        __init__.py\n        settings.py\n        urls.py\n        asgi.py\n        wsgi.py\n    polls/\n        __init__.py\n        admin.py\n        apps.py\n        migrations/\n            __init__.py\n            0001_initial.py\n        models.py\n        static/\n            polls/\n                images/\n                    background.png\n                style.css\n        templates/\n            polls/\n                detail.html\n                index.html\n                results.html\n        tests.py\n        urls.py\n        views.py\n    templates/\n        admin/\n            base_site.html\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>The current state of Python packaging is a bit muddled with various tools. For\nthis tutorial, we're going to use <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a> to build our package. It's\nthe recommended packaging tool (merged with the <code class=\"docutils literal notranslate\"><span class=\"pre\">distribute</span></code> fork). We'll\nalso be using <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pip/\">pip</a> to install and uninstall it. You should install these\ntwo packages now. If you need help, you can refer to <a class=\"reference internal\" href=\"/id/5.0/topics/install/#installing-official-release\"><span class=\"std std-ref\">how to install\nDjango with pip</span></a>. You can install <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code>\nthe same way.</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>First, create a parent directory for the package, outside of your Django\nproject. Call this directory <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>When choosing a name for your package, check PyPI to avoid naming\nconflicts with existing packages. We recommend using a <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code>\nprefix for package names, to identify your package as specific to\nDjango, and a corresponding <code class=\"docutils literal notranslate\"><span class=\"pre\">django_</span></code> prefix for your module name. For\nexample, the <code class=\"docutils literal notranslate\"><span class=\"pre\">django-ratelimit</span></code> package contains the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django_ratelimit</span></code> module.</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/5.0/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/5.0/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>Move the <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> directory into <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> directory, and rename it\nto <code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls</span></code>.</p></li>\n<li><p>Edit <code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls/apps.py</span></code> so that <a class=\"reference internal\" href=\"/id/5.0/ref/applications/#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">name</span></code></a> refers to the\nnew module name and add <a class=\"reference internal\" href=\"/id/5.0/ref/applications/#django.apps.AppConfig.label\" title=\"django.apps.AppConfig.label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">label</span></code></a> to give a short name for\nthe app:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/django_polls/apps.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AppConfig</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PollsConfig</span><span class=\"p\">(</span><span class=\"n\">AppConfig</span><span class=\"p\">):</span>\n    <span class=\"n\">default_auto_field</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.db.models.BigAutoField&quot;</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django_polls&quot;</span>\n    <span class=\"n\">label</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;polls&quot;</span>\n</code></pre></figure>\n</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\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code></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\">django-polls</span>\n<span class=\"gh\">============</span>\n\ndjango-polls is a 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\">        &quot;django_polls&quot;,</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(&quot;polls/&quot;, include(&quot;django_polls.urls&quot;)),\n\n<span class=\"m\">3.</span> Run <span class=\"s\">``python manage.py migrate``</span> to create the models.\n\n<span class=\"m\">4.</span> Start the development server and visit the admin to create a poll.\n\n<span class=\"m\">5.</span> Visit the <span class=\"s\">``/polls/``</span> URL 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>Selanjutnya kami akan membuat berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">pyproject.toml</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.cfg</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.py</span></code> yang merinci bagaimana membangun dan memasang aplikasi. Penjelasan penuh dari berkas ini diluar cakupan tutorial, tetapi <a class=\"reference external\" href=\"https://setuptools.pypa.io/en/latest/\">setuptools documentation</a> mempunyai penjelasan yang bagus. Buat berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/pyproject.toml</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.cfg</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code> dengan isi berikut:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"toml\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/pyproject.toml</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Toml</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=\"Toml code\"><code><span class=\"k\">[build-system]</span>\n<span class=\"n\">requires</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"s1\">&#39;setuptools&gt;=40.8.0&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">build-backend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;setuptools.build_meta&#39;</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"ini\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.cfg</span></code></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.10</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.11</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.12</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<span class=\"na\">python_requires</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">&gt;=3.10</span>\n<span class=\"na\">install_requires</span><span class=\"w\"> </span><span class=\"o\">=</span>\n<span class=\"w\">    </span><span class=\"na\">Django &gt;</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">X.Y</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"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>Only Python modules and packages are included in the package by default. To\ninclude additional files, we'll need to create a <code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code> file. The\n<code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code> docs referred to in the previous step discuss this file in\nmore detail. To include the templates, the <code class=\"docutils literal notranslate\"><span class=\"pre\">README.rst</span></code> and our\n<code class=\"docutils literal notranslate\"><span class=\"pre\">LICENSE</span></code> file, create a file <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> with the\nfollowing contents:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code></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 django_polls/static *\nrecursive-include django_polls/templates *\n</code></pre></figure>\n</li>\n<li><p>It's optional, but recommended, to include detailed documentation with your\napp. Create an empty directory <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/docs</span></code> for future\ndocumentation. Add an additional line to <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code>:</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>recursive-include docs *\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>Try building your package by running <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">setup.py</span> <span class=\"pre\">sdist</span></code> inside\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>. This creates a directory called <code class=\"docutils literal notranslate\"><span class=\"pre\">dist</span></code> and builds your\nnew package, <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls-0.1.tar.gz</span></code>.</p></li>\n</ol>\n<p>Untuk informasi lebih pada pemaketan, lihat <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Tutorial on Packaging and Distributing Projects</a>  Python.</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 per pemasangan pengguna dapat masih mempengaruhi perilaku peralatan sistem yang dijalankan pengguna tersebut, jadi menggunakan lingkunan maya adalah pemecahan yang lebih kokoh (lihat dibawah).</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>To install the package, use pip (you already <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">installed it</span></a>, right?):</p>\n<div class=\"code-block\" data-language=\"shell\"><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>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>--user<span class=\"w\"> </span>django-polls/dist/django-polls-0.1.tar.gz\n</code></pre></div>\n</li>\n<li><p>Update <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code> to point to the new module name:</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\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django_polls.apps.PollsConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Update <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/urls.py</span></code> to point to the new module name:</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\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;polls/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django_polls.urls&quot;</span><span class=\"p\">)),</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>Run the development server to confirm the project continues to work.</p></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-a-virtual-environment\">\n<h2>Menginstal paket Python dengan lingkungan virtual<a class=\"heading-anchor\" href=\"#installing-python-packages-with-a-virtual-environment\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Earlier, we installed <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> as a user library. This has some\ndisadvantages:</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 dapat hanya muncul ketika anda sedang merawat beberapa proyek Django. Ketika mereka melakukannya, pemecahan terbaik adalah menggunakan <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/venv.html\" title=\"(di Python v3.14)\"><span class=\"xref std std-doc\">venv</span></a>. Alat ini mengizinkan anda merawat banyak lingkungan Python terpencil, masing-masing dengan salinannya 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":"Menginstal paket Python dengan lingkungan virtual","anchor":"installing-python-packages-with-a-virtual-environment","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Mulai","url":"/id/5.0/intro/"}],"prev":{"docname":"intro/tutorial08","title":"Writing your first Django app, part 8","url":"/id/5.0/intro/tutorial08/"},"next":{"docname":"intro/whatsnext","title":"Apa yang akan dibaca selanjutnya","url":"/id/5.0/intro/whatsnext/"},"formats":{"html":"/id/5.0/intro/reusable-apps/","markdown":"/id/5.0/intro/reusable-apps.md","json":"/id/5.0/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/id/5.0/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","it","pt-br","ko","es","el","pl"]}