{"title":"Menulis aplikasi Django pertama anda, bagian 3","version":"1.9","locale":"id","docname":"intro/tutorial03","url":"/id/1.9/intro/tutorial03/","canonical":"https://djangodocs.dev/id/1.9/intro/tutorial03/","summary":"Tutorial ini mulai dimana Tutorial 2 tinggalkan. Kami sedang melanjutkan aplikasi jejak pendapat jaringan dan akan fokus membuat antarmuka umum -- \"tampilan\".…","html":"<h1>Menulis aplikasi Django pertama anda, bagian 3<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-3\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Tutorial ini mulai dimana <a class=\"reference internal\" href=\"/id/1.9/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a> tinggalkan. Kami sedang melanjutkan aplikasi jejak pendapat jaringan dan akan fokus membuat antarmuka umum -- &quot;tampilan&quot;.</p>\n<section id=\"overview\">\n<h2>Ikhtisar<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sebuah tampilan adalah &quot;jenis&quot; dari halaman Jaringan di aplikasi Django yang umumnya melayani fungsi khusus dan mempunyai cetakan khusus. Sebagai contoh, di aplikasi blog, anda mungkin mempunyai tampilan berikut:</p>\n<ul class=\"simple\">\n<li><p>Halaman rumah Blog -- menampilkan sedikit masukan terakhir.</p></li>\n<li><p>Halaman &quot;rincian&quot; masukan -- halaman permalink untuk masukan tunggal.</p></li>\n<li><p>Halaman arsip berdasarkan-tahun -- menampilkan semua bulan dengan masukan di tahun yang diberikan.</p></li>\n<li><p>Halaman arsip berdasarkan-bulan -- menampilkan semua hari dengan masukan di bulan yang diberikan.</p></li>\n<li><p>Halaman arsip berdasarkan-hari -- menampilkan semua masukan di hari yang diberikan.</p></li>\n<li><p>Tindakan komentar -- menangani penempatan komentar pada masukan yang diberikan.</p></li>\n</ul>\n<p>Di aplikasi jejak pendapat kami, kami akan mempunyai empat tampilan berikut:</p>\n<ul class=\"simple\">\n<li><p>Halaman &quot;index&quot; pertanyaan -- menampilkan sedikit pertanyaan terakhir.</p></li>\n<li><p>Halaman &quot;index&quot; pertanyaan -- menampilkan teks pertanyaan, dengan tidak ada hasil tetapi dengan formulir untuk memilih.</p></li>\n<li><p>Halaman &quot;hasil&quot; pertanyaan -- menampilkan hasil untuk pertanyaan tertentu.</p></li>\n<li><p>Tindakan pilih -- menangani pemilihan untuk pilihan tertentu di pertanyaan tertentu.</p></li>\n</ul>\n<p>Di DJango, halaman jaringan dan isi lain dikirimkan oleh tampilan. Setiap tampilan diwakilkan dengan fungsi Phyton sederhana (atau cara, di kasus ini dari tampilan berbasis-kelas). Django akan memilih tampilan dengan menguji URL yang diminta (agar akurat, bagian dari URL setelah nama ranah).</p>\n<p>Sekarang waktu anda di jaringan anda mungkin telah menemukan keindahan seperti &quot;ME2/Sites/dirmod.asp?sid=&amp;type=gen&amp;mod=Core+Pages&amp;gid=A6CD4967199A42D9B65B1B&quot;. Anda akan dipersilahkan untuk mengetahui bahwa Django mengizinkan kami lebih banyak elegan <em>corak URL</em> dari pada itu.</p>\n<p>Corak URL adalah formulir umum sederhana dari URL - sebagai contoh: <code class=\"docutils literal notranslate\"><span class=\"pre\">/newsarchive/&lt;year&gt;/&lt;month&gt;/</span></code>.</p>\n<p>Untuk mendapatkan URL pada tampilan, Django menggunakan apa yang dikenal sebagai 'URLconfs'. URLconfs memetakan corak URL (digambarkan sebagai regular expression) pada tampilan</p>\n<p>Tutorial ini menyediakan perintah dasar dalam penggunaan URLconfs, dan anda dapat mengacu ke <a class=\"reference internal\" href=\"/id/1.9/ref/urlresolvers/#module-django.core.urlresolvers\" title=\"django.core.urlresolvers\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.core.urlresolvers</span></code></a> untuk informasi lebih.</p>\n</section>\n<section id=\"writing-more-views\">\n<h2>Menulis tampilan lebih<a class=\"heading-anchor\" href=\"#writing-more-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sekarang mari kita menambahkan tampilan lebih pada <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/views.py</span></code>. Tampilan ini sedikit berbeda karena mereka mangambil argumen:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/views.py</code></figcaption><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=\"polls/views.py\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">detail</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">question_id</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;re looking at question </span><span class=\"si\">%s</span><span class=\"s2\">.&quot;</span> <span class=\"o\">%</span> <span class=\"n\">question_id</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">results</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">question_id</span><span class=\"p\">):</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;You&#39;re looking at the results of question </span><span class=\"si\">%s</span><span class=\"s2\">.&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">response</span> <span class=\"o\">%</span> <span class=\"n\">question_id</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">vote</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">question_id</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;You&#39;re voting on question </span><span class=\"si\">%s</span><span class=\"s2\">.&quot;</span> <span class=\"o\">%</span> <span class=\"n\">question_id</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Ikat tampilan baru ini ke dalam modul <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.urls</span></code> dengan menambahkan pemanggilan berikut <a class=\"reference internal\" href=\"/id/1.9/ref/urls/#django.conf.urls.url\" title=\"django.conf.urls.url\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">url()</span></code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/urls.py</code></figcaption><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=\"polls/urls.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">url</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ex: /polls/</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n    <span class=\"c1\"># ex: /polls/5/</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(?P&lt;question_id&gt;[0-9]+)/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">detail</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;detail&#39;</span><span class=\"p\">),</span>\n    <span class=\"c1\"># ex: /polls/5/results/</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(?P&lt;question_id&gt;[0-9]+)/results/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">results</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;results&#39;</span><span class=\"p\">),</span>\n    <span class=\"c1\"># ex: /polls/5/vote/</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(?P&lt;question_id&gt;[0-9]+)/vote/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">vote</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;vote&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Lihatlah di perambah anda, pada &quot;/polls/34/&quot;. Itu akan menjalankan cara <code class=\"docutils literal notranslate\"><span class=\"pre\">detail()</span></code> dan menampilkan ID apapun anda sediakan di URL. Coba &quot;/polls/34/results/&quot; dan &quot;/polls/34/vote/&quot; juga -- ini akan menampilkan hasil placeholder dan halaman pemilihan.</p>\n<p>When somebody requests a page from your website -- say, &quot;/polls/34/&quot;, Django\nwill load the <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite.urls</span></code> Python module because it's pointed to by the\n<a class=\"reference internal\" href=\"/id/1.9/ref/settings/#std-setting-ROOT_URLCONF\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ROOT_URLCONF</span></code></a> setting. It finds the variable named <code class=\"docutils literal notranslate\"><span class=\"pre\">urlpatterns</span></code>\nand traverses the regular expressions in order. After finding the match at\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'^polls/'</span></code>, it strips off the matching text (<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;polls/&quot;</span></code>) and sends the\nremaining text -- <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;34/&quot;</span></code> -- to the 'polls.urls' URLconf for further\nprocessing. There it matches <code class=\"docutils literal notranslate\"><span class=\"pre\">r'^(?P&lt;question_id&gt;[0-9]+)/$'</span></code>, resulting in a\ncall to the <code class=\"docutils literal notranslate\"><span class=\"pre\">detail()</span></code> view like so:</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\">detail</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">=&lt;</span><span class=\"n\">HttpRequest</span> <span class=\"nb\">object</span><span class=\"o\">&gt;</span><span class=\"p\">,</span> <span class=\"n\">question_id</span><span class=\"o\">=</span><span class=\"s1\">&#39;34&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Bagian question_id='34'` datang dari <code class=\"docutils literal notranslate\"><span class=\"pre\">(?P&lt;question_id&gt;[0-9]+)</span></code>. Menggunakan tanda kurung disekitar corak &quot;menangkap&quot; teks dicocokkan oleh corak itu dan dikirim sebagai argumen ke fungsi tampilan; <code class=\"docutils literal notranslate\"><span class=\"pre\">?P&lt;question_id&gt;</span></code> menentukan nama yang akan digunakan untuk mencirikan corak dicocokkan; dan <code class=\"docutils literal notranslate\"><span class=\"pre\">[0-9]+</span></code> adalah regular expression untuk mencocokkan urutan angka (yaitu sebuah angka).</p>\n<p>Karena corak URL adalah regular expression, mereka sangat tidak terbatas pada apa yang anda dapat lakukan dengan mereka. Dan tidak perlu menambahkan rancangan jelek URL seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">.html</span></code> -- meskipun anda ingin, dalamhal ini anda dapat melakukan sesuatu 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\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^polls/latest\\.html$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">),</span>\n</code></pre></div>\n<p>Tetapi, jangan melakukan itu. Itu lucu.</p>\n</section>\n<section id=\"write-views-that-actually-do-something\">\n<h2>Tulis tampilan yang sebenarnya melakukan sesuatu<a class=\"heading-anchor\" href=\"#write-views-that-actually-do-something\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Setiap tampilan bertanggung jawab untuk melakukan satu dari dua hal: mengembalikan sebuah obyek <a class=\"reference internal\" href=\"/id/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> mengandung isi untuk halaman diminta, atau menimbulkan sebuah pengecualian seperti <a class=\"reference internal\" href=\"/id/1.9/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a>. Sisanya terserah anda.</p>\n<p>Tampilan anda dapat membaca rekaman dari basisdata, atau tidak. Dia dapat menggunakan cetakan sistem seperti DJango -- atau sistem cetakan Phyton pihak-ketiga -- atau tidak. Dia dapat membangkitkan berkas PDF, mengeluarkan XML, membuat berkas ZIP dengan cepat, apapun anda inginkan, menggunakan pustaka Phyton apapun anda inginkan.</p>\n<p>Semua Django inginkan adalah <a class=\"reference internal\" href=\"/id/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>. Atau sebuah pengecualian.</p>\n<p>Karena sangat nyaman, mari kita menggunakan API basisdata Django sendiri, yang akan melingkupi di <a class=\"reference internal\" href=\"/id/1.9/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>. Ini satu tikaman pada tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">index()</span></code> baru, yang menampilka pertanyaan jejak pendapat 5 terakhir di sistem, dipisahkan oleh koma, menurut tanggal penerbitan:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/views.py</code></figcaption><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=\"polls/views.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">index</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">latest_question_list</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;, &#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">([</span><span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">question_text</span> <span class=\"k\">for</span> <span class=\"n\">q</span> <span class=\"ow\">in</span> <span class=\"n\">latest_question_list</span><span class=\"p\">])</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Leave the rest of the views (detail, results, vote) unchanged</span>\n</code></pre></figure>\n<p>Tidak ada masalah disini, meskipun: rancangan halaman adalah kode-keras di tampilan. Jika anda ingin merubah cara tampilan halaman, anda harus menyunting kode Phyton ini. Jadi mari kita menggunakan sistem cetakan Django untuk memisahkan rancangan dari Phyton dengan membuat cetakan yang tampilan dapat digunakan.</p>\n<p>Pertama, buat direktori disebut <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> di direktori``polls``. Django akan mencari cetakan disana.</p>\n<p>Pengaturan <a class=\"reference internal\" href=\"/id/1.9/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> proyek anda menggambarkan bagaimana Django akan memuat dan membaut halaman. Pengaturan awal berkas mengkonfigurasikan backend <code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoTemplates</span></code> yang pilihan <a class=\"reference internal\" href=\"/id/1.9/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> adalah disetel ke <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Berdasarkan kaidah <code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoTemplates</span></code> mencari untuk subdirektori :cetakan&quot; dalam setiap <a class=\"reference internal\" href=\"/id/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n<p>Dalam direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> anda telah buat, buat direktori lain disebut <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>, dan dalam itu buat sebuah berkas disebut <code class=\"docutils literal notranslate\"><span class=\"pre\">index.html</span></code>. Dengan kata lain, cetakan anda harus di <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/polls/index.html</span></code>. Karena bagaimana pemuat cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">app_directories</span></code> bekerja seperti yang digambarkan diatas, anda dapat mengacu ke cetakan ini dalam Django hanya sebagai <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/index.html</span></code>.</p>\n<aside class=\"admonition-template-namespacing admonition\">\n<p class=\"admonition-title\">Namespacing cetakan</p>\n<p>Sekarang kami <em>mungkin</em> dapat lolos dengan menaruh cetakan kami langsung di <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code> (daripada membuat subdirektori <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> lain), tetapi itu mungkin ide buruk. Django akan memilih cetakan pertama dia temukan yang namanya cocok, dan jika anda mempunyai cetakan dengan nama sama di aplikasi <em>berbeda</em>. Django akan tidak dapat membedakan diantara mereka. Kami butuh dapat menunjuk Django satu yang benar, dan cara termudah untuk memastikan ini adalah dengan <em>namespace</em> mereka. Itu adalah, dengan menaruh cetakan tersebut didalam direktori <em>lain</em> dinamai untuk aplikasi itu sendiri.</p>\n</aside>\n<p>Taruh kode berikut di cetakan itu:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>polls/templates/polls/index.html</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"polls/templates/polls/index.html\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">latest_question_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">question</span> <span class=\"k\">in</span> <span class=\"nv\">latest_question_list</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/polls/</span><span class=\"cp\">{{</span> <span class=\"nv\">question.id</span> <span class=\"cp\">}}</span><span class=\"s\">/&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>No polls are available.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>Sekarang mari kita perbaharui tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code> di <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/views.py</span></code> untuk menggunakan cetakan:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/views.py</code></figcaption><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=\"polls/views.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">loader</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">index</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">latest_question_list</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n    <span class=\"n\">template</span> <span class=\"o\">=</span> <span class=\"n\">loader</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls/index.html&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;latest_question_list&#39;</span><span class=\"p\">:</span> <span class=\"n\">latest_question_list</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">))</span>\n</code></pre></figure>\n<p>Kode memuat cetakan disebut <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/index.html</span></code> dan melewatkannya ke konteks. Konteks adalah kamus variabel cetakan pemetaan dinamai untuk obyek Phyton.</p>\n<p>Muat halaman dengan menunjuk perambah anda pada &quot;/polls/&quot;, dan anda akan melihat daftar-bullet mengandung pertanyaan &quot;Ada apa&quot; dari <a class=\"reference internal\" href=\"/id/1.9/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>. Tautan menunjuk ke halaman rincian pertanyaan.</p>\n<section id=\"a-shortcut-render\">\n<h3>Jalan pintas: <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#django.shortcuts.render\" title=\"django.shortcuts.render\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">render()</span></code></a><a class=\"heading-anchor\" href=\"#a-shortcut-render\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Itu adalah dialek umum untuk memuat cetakan, isi konteks dan mengembalikan sebuah obyek <a class=\"reference internal\" href=\"/id/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> dengan hasil dari cetakan dibuat. Django menyediakan jalan pintas. Disini tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">index()</span></code> penuh, ditulis kembali:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/views.py</code></figcaption><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=\"polls/views.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">index</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">latest_question_list</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n    <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;latest_question_list&#39;</span><span class=\"p\">:</span> <span class=\"n\">latest_question_list</span><span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;polls/index.html&#39;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Catat bahwa sekali kami telah selesaikan ini di semua tampilan ini, kami tidak lagi butuh mengimpor <a class=\"reference internal\" href=\"/id/1.9/topics/templates/#module-django.template.loader\" title=\"django.template.loader\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">loader</span></code></a> dan <a class=\"reference internal\" href=\"/id/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> (anda akan ingin menjaga <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code> jika anda masih mempunyai potongan cara untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">detail</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">results</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">vote</span></code>).</p>\n<p>Fungsi <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#django.shortcuts.render\" title=\"django.shortcuts.render\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">render()</span></code></a> mengambil permintaan obyek sebagai argumen pertamanya, nama cetakan sebagai argumen keduanya dan kamus sebagai pilihan argumen ketiganya. Dia mengembalikan sebuah obyek <a class=\"reference internal\" href=\"/id/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> dari cetakan diberikan dibangun dengan konteks yang diberikan.</p>\n</section>\n</section>\n<section id=\"raising-a-404-error\">\n<h2>Menaikkan kesalahan 404<a class=\"heading-anchor\" href=\"#raising-a-404-error\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sekarang, mari kita mengerjakan tampilan rincian pertanyaan -- halaman yang menampilkan teks pertanyaan untuk jejak pertanyaan yang diberikan. Inilah tampilan:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/views.py</code></figcaption><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=\"polls/views.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Http404</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n<span class=\"c1\"># ...</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">detail</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">question_id</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">question_id</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">Http404</span><span class=\"p\">(</span><span class=\"s2\">&quot;Question does not exist&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;polls/detail.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;question&#39;</span><span class=\"p\">:</span> <span class=\"n\">question</span><span class=\"p\">})</span>\n</code></pre></figure>\n<p>Konsep baru disini: Tapilan memunculkan pengecualian <a class=\"reference internal\" href=\"/id/1.9/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> jika sebuah pertanyaan dengan ID diminta tidak ada.</p>\n<p>Kami akan berunding apa anda dapat taruh di cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/detail.html</span></code> itu kemudian, tetapi jika anda suka mendapatkan cepat contoh diatas bekerja, sebuah berkas mengandung hanya:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>polls/templates/polls/detail.html</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"polls/templates/polls/detail.html\"><code><span class=\"cp\">{{</span> <span class=\"nv\">question</span> <span class=\"cp\">}}</span>\n</code></pre></figure>\n<p>akan membantu anda mulai untuk sekarang.</p>\n<section id=\"a-shortcut-get-object-or-404\">\n<h3>Jalan pintas: <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_object_or_404()</span></code></a><a class=\"heading-anchor\" href=\"#a-shortcut-get-object-or-404\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Adalah dialek umum untuk menggunakan <a class=\"reference internal\" href=\"/id/1.9/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> dan menimbulkan <a class=\"reference internal\" href=\"/id/1.9/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> jika obyek tidak ada. Django menyediakan jalan pintas. Ini tampilan detail()`, ditulis kembali:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/views.py</code></figcaption><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=\"polls/views.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_object_or_404</span><span class=\"p\">,</span> <span class=\"n\">render</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n<span class=\"c1\"># ...</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">detail</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">question_id</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">get_object_or_404</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">question_id</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;polls/detail.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;question&#39;</span><span class=\"p\">:</span> <span class=\"n\">question</span><span class=\"p\">})</span>\n</code></pre></figure>\n<p>Fungsi <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_object_or_404()</span></code></a> mengambil model Django sebagai argumen pertamanya dan angka sewenang-wenang dari kata kunci argumen, yang dia melalui fungsi <a class=\"reference internal\" href=\"/id/1.9/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> dari pengelola model. Dia menimbulkan <a class=\"reference internal\" href=\"/id/1.9/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> jika obyek tidak ada.</p>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">Filosofi</p>\n<p>Kenapa kami menggunakan fungsi pembantu <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_object_or_404()</span></code></a> daripada otomatis menangkap pengecualian <a class=\"reference internal\" href=\"/id/1.9/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ObjectDoesNotExist</span></code></a> pada tingkatan lebih tinggi, atau mempunyai API model menimbulkan <a class=\"reference internal\" href=\"/id/1.9/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> daripada <a class=\"reference internal\" href=\"/id/1.9/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ObjectDoesNotExist</span></code></a>?</p>\n<p>Karena itu akan memasangkan lapisan model ke lapisan tampilan. Satu dari terutama sasaran rancangan dari Django adalah merawat sambungan longgar. Beberapa sambungan terkendali diperkenalkan di modul <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#module-django.shortcuts\" title=\"django.shortcuts: Convenience shortcuts that span multiple levels of Django's MVC stack.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.shortcuts</span></code></a>.</p>\n</aside>\n<p>Terdapat juga sebuah fungsi <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#django.shortcuts.get_list_or_404\" title=\"django.shortcuts.get_list_or_404\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_list_or_404()</span></code></a>, yang bekerja hanya sebagai <a class=\"reference internal\" href=\"/id/1.9/topics/http/shortcuts/#django.shortcuts.get_object_or_404\" title=\"django.shortcuts.get_object_or_404\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_object_or_404()</span></code></a> -- kecuali menggunakan <a class=\"reference internal\" href=\"/id/1.9/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a> daripada <a class=\"reference internal\" href=\"/id/1.9/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a>. Itu memunculkan <a class=\"reference internal\" href=\"/id/1.9/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> jika daftar kosong.</p>\n</section>\n</section>\n<section id=\"use-the-template-system\">\n<h2>Gunakan sistem cetakan<a class=\"heading-anchor\" href=\"#use-the-template-system\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Kembali ke tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">detail()</span></code> untuk aplikasi jejak pendapat kami. Diberikan variabel konteks <code class=\"docutils literal notranslate\"><span class=\"pre\">question</span></code>, disini adalah apa cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/detail.html</span></code> mungkin kelihatan seperti:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>polls/templates/polls/detail.html</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"polls/templates/polls/detail.html\"><code><span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">choice</span> <span class=\"k\">in</span> <span class=\"nv\">question.choice_set.all</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">choice.choice_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Sistem cetakan menggunakan sintaks dot-lookup untuk mengakses atribut variabel. Di contoh dari <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">question.question_text</span> <span class=\"pre\">}}</span></code>, pertama Django melakukan lookup perkamusan pada obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">question</span></code>. Kegagalan itu, dia mencoba sebuah atribut lookup -- yang bekerja, di kasus ini. Jika atribut lookup telah gagal, dia akan mencoba list-index lookup.</p>\n<p>Pemanggilan-cara terjadi di <a class=\"reference internal\" href=\"/id/1.9/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code></a> loop: <code class=\"docutils literal notranslate\"><span class=\"pre\">question.choice_set.all</span></code> adalah ditafsirkan sebagai kode Phyton <code class=\"docutils literal notranslate\"><span class=\"pre\">question.choice_set.all()</span></code>, yang mengembalikan berulang obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> dan cocok untuk digunakan di etiket <a class=\"reference internal\" href=\"/id/1.9/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code></a>.</p>\n<p>Lihat <a class=\"reference internal\" href=\"/id/1.9/topics/templates/\"><span class=\"doc\">panduan cetakan</span></a> untuk lebih tentang cetakan.</p>\n</section>\n<section id=\"removing-hardcoded-urls-in-templates\">\n<h2>Memindahkan URL kode keras di cetakan<a class=\"heading-anchor\" href=\"#removing-hardcoded-urls-in-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ingat, ketika kami menulis tautan ke pertanyaan di cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/index.html</span></code>, tautan sebagian dikodekan keras seperti ini:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/polls/</span><span class=\"cp\">{{</span> <span class=\"nv\">question.id</span> <span class=\"cp\">}}</span><span class=\"s\">/&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Masalah dengan kode keras ini, pendekatam pasangan-erat adalah bahwa dia menjadi menantang untuk merubah URL di proyek anda dengan banyak cetakan. Bagaimanapun, sejak anda menentukan nama argumen di fungsi <a class=\"reference internal\" href=\"/id/1.9/ref/urls/#django.conf.urls.url\" title=\"django.conf.urls.url\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">url()</span></code></a> di modul <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.urls</span></code>, anda dapat memindahkan kepercayaan pada jalur URL khusus ditentukan di konfigurasi url anda dengan menggunakan etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">url</span> <span class=\"pre\">%}</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;detail&#39;</span> <span class=\"nv\">question.id</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Cara ini bekerja adalah dengan mencari pengertian URL seperti yang ditentukan di modul <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.urls</span></code>. Anda dapat melihat sebenarnya dimana nama URL dari 'rincian' ditentukan dibawah:</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=\"o\">...</span>\n<span class=\"c1\"># the &#39;name&#39; value as called by the {% url %} template tag</span>\n<span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(?P&lt;question_id&gt;[0-9]+)/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">detail</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;detail&#39;</span><span class=\"p\">),</span>\n<span class=\"o\">...</span>\n</code></pre></div>\n<p>Jika anda ingin merubah URL dari tampilan rinci jejak pendapat ke sesuatu lain, mungkin ke sesuatu seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/specifics/12/</span></code> dibandingkan melakukannya di cetakan (atau cetakan-cetakan) anda akan merubahnya di <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/urls.py</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=\"o\">...</span>\n<span class=\"c1\"># added the word &#39;specifics&#39;</span>\n<span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^specifics/(?P&lt;question_id&gt;[0-9]+)/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">detail</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;detail&#39;</span><span class=\"p\">),</span>\n<span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"namespacing-url-names\">\n<h2>Nama URL namespacing<a class=\"heading-anchor\" href=\"#namespacing-url-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Proyek tutorial hanya punya satu aplikasi, <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>. Di proyek Django nyata, mungkin ada lima, sepuluh, dua puluh aplikasi atau lebih. Bagaimana Django membedakan nama URL diantara mereka? Sebagai contoh, aplikasi <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> mempunyai tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">detail</span></code>, dan mungkin sebuah aplikasi di proyek sama yaitu untuk sebuah blog. Bagaimana satu membuatnya sehingga Django mengetahui tampilan aplikasi mana untuk membuat untuk sebuah url ketika menggunakan etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">url</span> <span class=\"pre\">%}</span></code>?</p>\n<p>Jawabannya adalah menambahkan namespace ke URLconf anda. Di berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/urls.py</span></code>, lanjutkan dan tambah <code class=\"docutils literal notranslate\"><span class=\"pre\">app_name</span></code> untuk mengatur namespace aplikasi:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>polls/urls.py</code></figcaption><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=\"polls/urls.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">url</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"n\">app_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;polls&#39;</span>\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(?P&lt;question_id&gt;[0-9]+)/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">detail</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;detail&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(?P&lt;question_id&gt;[0-9]+)/results/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">results</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;results&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^(?P&lt;question_id&gt;[0-9]+)/vote/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">vote</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;vote&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Sekarang rubah cetakan  <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/index.html</span></code> anda dari:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>polls/templates/polls/index.html</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"polls/templates/polls/index.html\"><code><span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;detail&#39;</span> <span class=\"nv\">question.id</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>untuk menunjuk tampilan rincian namespace:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>polls/templates/polls/index.html</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"polls/templates/polls/index.html\"><code><span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;polls:detail&#39;</span> <span class=\"nv\">question.id</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">question.question_text</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Ketika anda nyaman dengan tampilan penulisan, baca <a class=\"reference internal\" href=\"/id/1.9/intro/tutorial04/\"><span class=\"doc\">bagian 4 dari tutorial ini</span></a> untuk mempelajari tentang bentuk sederhana pengolahan dan tampilan umum.</p>\n</section>","rootId":"writing-your-first-django-app-part-3","toc":[{"title":"Ikhtisar","anchor":"overview","children":[]},{"title":"Menulis tampilan lebih","anchor":"writing-more-views","children":[]},{"title":"Tulis tampilan yang sebenarnya melakukan sesuatu","anchor":"write-views-that-actually-do-something","children":[{"title":"Jalan pintas: render()","anchor":"a-shortcut-render","children":[]}]},{"title":"Menaikkan kesalahan 404","anchor":"raising-a-404-error","children":[{"title":"Jalan pintas: get_object_or_404()","anchor":"a-shortcut-get-object-or-404","children":[]}]},{"title":"Gunakan sistem cetakan","anchor":"use-the-template-system","children":[]},{"title":"Memindahkan URL kode keras di cetakan","anchor":"removing-hardcoded-urls-in-templates","children":[]},{"title":"Nama URL namespacing","anchor":"namespacing-url-names","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Mulai","url":"/id/1.9/intro/"}],"prev":{"docname":"intro/tutorial02","title":"Menulis aplikasi Django kedua anda, bagian 2","url":"/id/1.9/intro/tutorial02/"},"next":{"docname":"intro/tutorial04","title":"Menulis aplikasi Django pertama anda, bagian 4","url":"/id/1.9/intro/tutorial04/"},"formats":{"html":"/id/1.9/intro/tutorial03/","markdown":"/id/1.9/intro/tutorial03.md","json":"/id/1.9/intro/tutorial03.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/intro/tutorial03.txt","official":"https://docs.djangoproject.com/id/1.9/intro/tutorial03/","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"]}