{"title":"Menulis aplikasi Django pertama anda, bagian 4","version":"6.0","locale":"id","docname":"intro/tutorial04","url":"/id/6.0/intro/tutorial04/","canonical":"https://djangodocs.dev/id/6.0/intro/tutorial04/","summary":"Tutorial ini memulai dimana Tutorial 3 ditinggalkan. Kami sedang melanjutkan aplikasi poling jaringan dan akan fokus pada pengolahan formulit dan memotong kode…","html":"<h1>Menulis aplikasi Django pertama anda, bagian 4<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-4\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Tutorial ini memulai dimana <a class=\"reference internal\" href=\"/id/6.0/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a> ditinggalkan. Kami sedang melanjutkan aplikasi poling jaringan dan akan fokus pada pengolahan formulit dan memotong kode kami.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Dimana mendapatkan bantuan:</p>\n<p>Jika anda memiliki masalah melalui tutorial ini, harap geser ke <a class=\"reference internal\" href=\"/id/6.0/faq/help/\"><span class=\"doc\">Getting Help</span></a> bagian dari FAQ.</p>\n</aside>\n<section id=\"write-a-minimal-form\">\n<h2>Tulis sebuah formulir minimal<a class=\"heading-anchor\" href=\"#write-a-minimal-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Mari kita memperbaharui cetakan rincian jejak pendapat (&quot;polls/detail.html&quot;) dari tutorial terakhir, sehingga cetakan mengandung sebuah unsur <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;form&gt;</span></code> HTML:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/polls/detail.html</span></code></figcaption>\n<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\">form</span> <span class=\"na\">action</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;polls:vote&#39;</span> <span class=\"nv\">question.id</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">csrf_token</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">fieldset</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">legend</span><span class=\"p\">&gt;&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;&lt;/</span><span class=\"nt\">legend</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">error_message</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">error_message</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">strong</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</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\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;choice&quot;</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;choice</span><span class=\"cp\">{{</span> <span class=\"nb\">forloop</span><span class=\"nv\">.counter</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">choice.id</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;choice</span><span class=\"cp\">{{</span> <span class=\"nb\">forloop</span><span class=\"nv\">.counter</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</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\">label</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">br</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\">fieldset</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;Vote&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Laporan cepat :</p>\n<ul class=\"simple\">\n<li><p>Cetakan diatas menampilkan tombol radio untuk setiap pilihan pertanyaan. <code class=\"docutils literal notranslate\"><span class=\"pre\">nilai</span></code> dari setiap tombol adalah ID pilihan pertanyaan dikaitkan. <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> dari setiap tombol radio adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pilihan&quot;</span></code>. itu berarti, ketika seseorang memilih satu dari tombol radio dan mengajukan formulir, itu akan mengirim data POST <code class=\"docutils literal notranslate\"><span class=\"pre\">choice=#</span></code> dimana # adalah ID dari pilihan terpilih. Ini adalah konsep dasar dari formulir HTML.</p></li>\n<li><p>Kami mensetel <code class=\"docutils literal notranslate\"><span class=\"pre\">action</span></code> formulir menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">url</span> <span class=\"pre\">'polls:vote'</span> <span class=\"pre\">question.id</span> <span class=\"pre\">%}</span></code>, dan kami mensetel <code class=\"docutils literal notranslate\"><span class=\"pre\">method=&quot;post&quot;</span></code>. Menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">method=&quot;post&quot;</span></code> (sebagai lawan <code class=\"docutils literal notranslate\"><span class=\"pre\">method=&quot;get&quot;</span></code>) adalah sangat penting, karena tindakan mengajukan formulir ini akan merubah data sisi-peladen. Kapanpun anda membuat sebuah formulir yang merubah data sisi-peladen, gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">method=&quot;post&quot;</span></code>. Saran ini tidak khusus pada Django; itu adalah praktik pengembangan jaringan baik secara umum.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">forloop.counter</span></code> mengindikasikan seberapa kali the <code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">untuk</span></code> etiket telah melalui putarannya</p></li>\n<li><p>Sejak kami membuat formulir POST (yang dapat memiliki pengaruh dari merubah data), kami perlu khawatir mengenai Cross Site Request Forgeries. Untungnya, anda tidak perlu khawatir terlalu keras, karena Django datang dengan sistem sangat membantu untuk perlindungan terhadapnya. Pendeknya, semua formulir POST yang menyasarkan pada URL dalam harus menggunakan etiket cetakan <a class=\"reference internal\" href=\"/id/6.0/ref/templates/builtins/#std-templatetag-csrf_token\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">csrf_token</span> <span class=\"pre\">%}</span></code></a>.</p></li>\n</ul>\n<p>Sekarang, mari kita membuat tampilan Django yang menangani data diajukan dan melakukan sesuatu dengannya. Ingat, di <a class=\"reference internal\" href=\"/id/6.0/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>, kami membuat URLconf untuk aplikasi jejak pendapat yang menyertakan baris ini:</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\">polls/urls.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=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/vote/&quot;</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=\"s2\">&quot;vote&quot;</span><span class=\"p\">),</span>\n</code></pre></figure>\n<p>Kami juga membuat penerapan tiruan dari fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">vote()</span></code>. mari kita membuat versi sebenarnya. Tambah berikut ke <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/views.py</span></code>:</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\">polls/views.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.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span>\n<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><span class=\"p\">,</span> <span class=\"n\">HttpResponseRedirect</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\">get_object_or_404</span><span class=\"p\">,</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</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\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n\n<span class=\"c1\"># ...</span>\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=\"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\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">selected_choice</span> <span class=\"o\">=</span> <span class=\"n\">question</span><span class=\"o\">.</span><span class=\"n\">choice_set</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\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s2\">&quot;choice&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">except</span> <span class=\"p\">(</span><span class=\"ne\">KeyError</span><span class=\"p\">,</span> <span class=\"n\">Choice</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Redisplay the question voting form.</span>\n        <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span>\n            <span class=\"n\">request</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;polls/detail.html&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;question&quot;</span><span class=\"p\">:</span> <span class=\"n\">question</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;error_message&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;You didn&#39;t select a choice.&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">selected_choice</span><span class=\"o\">.</span><span class=\"n\">votes</span> <span class=\"o\">=</span> <span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;votes&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n        <span class=\"n\">selected_choice</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n        <span class=\"c1\"># Always return an HttpResponseRedirect after successfully dealing</span>\n        <span class=\"c1\"># with POST data. This prevents data from being posted twice if a</span>\n        <span class=\"c1\"># user hits the Back button.</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;polls:results&quot;</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">question</span><span class=\"o\">.</span><span class=\"n\">id</span><span class=\"p\">,)))</span>\n</code></pre></figure>\n<p>Kode ini menyertakan beberapa hal kami belum tangani di tutorial ini:</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpRequest.POST\" title=\"django.http.HttpRequest.POST\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.POST</span></code></a> adalah obyek seperti-kamus yang membiarkan anda akses data diajukan oleh nama kunci. Di kasus ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST['choice']</span></code> mengembalikan ID dari pilihan terpilih, sebagai string. Nilai <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpRequest.POST\" title=\"django.http.HttpRequest.POST\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.POST</span></code></a> selalu string.</p>\n<p>Catat bahwa Django juga menyediakan <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpRequest.GET\" title=\"django.http.HttpRequest.GET\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.GET</span></code></a> untuk mengakses data GET di cara sama -- tetapi kami eksplisit menggunakan <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpRequest.POST\" title=\"django.http.HttpRequest.POST\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.POST</span></code></a> di kode kami, untuk memastikan bahwa data hanya diubah melalui panggilan POST.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST['choice']</span></code> akan menaikkan <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#KeyError\" title=\"(di Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">KeyError</span></code></a> jika <code class=\"docutils literal notranslate\"><span class=\"pre\">pilihan</span></code> tidak disediakan di data POST. Kode diatas memeriksa untuk <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#KeyError\" title=\"(di Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">KeyError</span></code></a> dan menampilkan kembali formulir pertanyaan dengan pesan kesalahan jika <code class=\"docutils literal notranslate\"><span class=\"pre\">pilihan</span></code> tidak diberikan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">F(&quot;votes&quot;)</span> <span class=\"pre\">+</span> <span class=\"pre\">1</span></code> <a class=\"reference internal\" href=\"/id/6.0/ref/models/expressions/#avoiding-race-conditions-using-f\"><span class=\"std std-ref\">instructs the database</span></a> to increase the vote count by 1.</p></li>\n<li><p>Setelah menaikkan jumlah pilihan, kode mengembalikan sebuah <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseRedirect</span></code></a> daripada <a class=\"reference internal\" href=\"/id/6.0/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> biasa. <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseRedirect</span></code></a> mengambil argumen tunggal: URL dimana pengguna akan dialihkan (lihat titik berikut untuk bagaimana membangun URL di kasus ini).</p>\n<p>Seperti ditunjukkan komentar Python diatas, aanda harus selalu mengembalikan <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseRedirect</span></code></a> setelah berhasil berurusan dengan data POST. Saran ini tidak khusus pada Django; itu adalah praktik pengembangan jaringan bagus secara umum.</p>\n</li>\n<li><p>Kami sedang menggunakan fungsi <a class=\"reference internal\" href=\"/id/6.0/ref/urlresolvers/#django.urls.reverse\" title=\"django.urls.reverse\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">reverse()</span></code></a> di pembangun <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseRedirect</span></code></a> di contoh ini. Fungsi ini membantu mengindari memiliki URL kode keras di fungsi tampilan. Itu diberikan nama dari tampilan yang kami ingin melewatkan kendali ke dan bagian variabel dari corak URL yang menunjuk ke tampilan itu. Dalam kasus ini, menggunakan URLconf kami setel di <a class=\"reference internal\" href=\"/id/6.0/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>, panggilan <a class=\"reference internal\" href=\"/id/6.0/ref/urlresolvers/#django.urls.reverse\" title=\"django.urls.reverse\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">reverse()</span></code></a> ini akan mengembalikan deretan karakter seperti</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=\"s2\">&quot;/polls/3/results/&quot;</span>\n</code></pre></div>\n<p>dimana <code class=\"docutils literal notranslate\"><span class=\"pre\">3</span></code> adalah nilai dari <code class=\"docutils literal notranslate\"><span class=\"pre\">question.id</span></code>. Ini URL dialihkan akan memanggil tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">'results'</span></code> untuk menampilkan halaman akhir.</p>\n</li>\n</ul>\n<p>Seperti disebutkan di <a class=\"reference internal\" href=\"/id/6.0/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> adalah sebuah obyek <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. Untuk lebih pada obyek <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>, lihat <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/\"><span class=\"doc\">permintaan dan tanggapan dokumentasi</span></a>.</p>\n<p>Setelah seseorang memilih di pertanyaan, tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">vote()</span></code> mengalihkan ke halaman hasil untuk pertanyaan. Mari kita tulis tampilan itu:</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\">polls/views.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.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\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\">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=\"s2\">&quot;polls/results.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;question&quot;</span><span class=\"p\">:</span> <span class=\"n\">question</span><span class=\"p\">})</span>\n</code></pre></figure>\n<p>Ini hampir tepat sama seperti tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">detail()</span></code> dari <a class=\"reference internal\" href=\"/id/6.0/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>. Perbedaannya adalah hanya nama cetakan. Kami akan memperbaiki kelebihan ini kemudian.</p>\n<p>Sekarang, buat cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/result.html</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/polls/results.html</span></code></figcaption>\n<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\">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\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=\"cp\">{{</span> <span class=\"nv\">choice.votes</span> <span class=\"cp\">}}</span> vote<span class=\"cp\">{{</span> <span class=\"nv\">choice.votes</span><span class=\"o\">|</span><span class=\"nf\">pluralize</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\n<span class=\"p\">&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>Vote again?<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Sekarang, pergi ke <code class=\"docutils literal notranslate\"><span class=\"pre\">/polls/1/</span></code> di perambah anda dan pilih di pertanyaan. Anda seharusnya melihat halaman hasil yang mendapatkan pembaharuan setiap waktu anda memilih. Jika anda mengajukan formulir tanpa memilih pilihan, anda akan melihat pesan kesalahan.</p>\n</section>\n<section id=\"use-generic-views-less-code-is-better\">\n<h2>Gunakan tampilan umum: Sedikit kode lebih baik<a class=\"heading-anchor\" href=\"#use-generic-views-less-code-is-better\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">detail()</span></code> (from <a class=\"reference internal\" href=\"/id/6.0/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>) dan <code class=\"docutils literal notranslate\"><span class=\"pre\">results()</span></code> sangat pendek -- dand seperti disebutkan diatas, berlebih-lebihan. Tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">index()</span></code>, yang menampilkan daftar dari jejak pendapat, adalah mirip.</p>\n<p>Tampilan ini mewakili kasus umum dari pengembangan dasar jaringan: mendapatkan data dari basisdata menurut sebuah parameter dilewatkan dalam URL, membuat sebuah cetakan dan mengembalikan cetakan yang dibangun. Karena ini sudah umum, Django menyediakan jalan pintas, disebut sistem &quot;generic views&quot;.</p>\n<p>Generic views abstract common patterns to the point where you don't even need\nto write Python code to write an app. For example, the\n<a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ListView</span></code></a> and\n<a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DetailView</span></code></a> generic views abstract the\nconcepts of &quot;display a list of objects&quot; and &quot;display a detail page for a\nparticular type of object&quot; respectively.</p>\n<p>Mari rubah aplikasi jejak pendapat kami menggunakan sistem tampilan umum, sehingga kami dapat menghapus sekelompok dari kode milik kami. Kami harus mengambil beberapa langkah untuk membuat perubahan. Kami akan:</p>\n<ol class=\"arabic simple\">\n<li><p>Rubah URLconf.</p></li>\n<li><p>Hapus beberapa lama, tampilan tidak dibutuhkan.</p></li>\n<li><p>Memperkenalkan tampilan baru berbasis pada tampilan umum Django.</p></li>\n</ol>\n<p>Membaca untuk rinci.</p>\n<aside class=\"admonition-why-the-code-shuffle admonition\">\n<p class=\"admonition-title\">Kenapa kode dikocok?</p>\n<p>Umumnya, ketika menulis aplikasi Django, anda akan menilai apakah tampilan umum cocok untuk masalah anda, dan anda akan menggunakan mereka dari mulai, daripada mengurai kembali kode anda setengah jalan. Tetapi tutorial ini sengaja fokus pada penulisan tampilan &quot;cara sulit&quot; sampai sekarang, untuk fokus pada konsep inti.</p>\n<p>Anda harus mengetahui matematika dasar sebelum mulai menggunakan penghitung.</p>\n</aside>\n<section id=\"amend-urlconf\">\n<h3>Merubah URLconf<a class=\"heading-anchor\" href=\"#amend-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pertama, buka URLconf <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/urls.py</span></code> dan rubah nya seperti itu:</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\">polls/urls.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.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</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=\"s2\">&quot;polls&quot;</span>\n<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;&quot;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">IndexView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:pk&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">DetailView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:pk&gt;/results/&quot;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">ResultsView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;results&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;int:question_id&gt;/vote/&quot;</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=\"s2\">&quot;vote&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Note that the name of the matched pattern in the path strings of the second and\nthird patterns has changed from <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;question_id&gt;</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;pk&gt;</span></code>. This is\nnecessary because we'll use the\n<a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DetailView</span></code></a> generic view to replace our\n<code class=\"docutils literal notranslate\"><span class=\"pre\">detail()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">results()</span></code> views, and it expects the primary key value\ncaptured from the URL to be called <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pk&quot;</span></code>.</p>\n</section>\n<section id=\"amend-views\">\n<h3>Merubah tampilan<a class=\"heading-anchor\" href=\"#amend-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Selanjutnya, kami akan memindahkan tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">detail</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">results</span></code> lama dan menggunakan tampilan umum Django. Untuk melakukannya, buka berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/views.py</span></code> dan rubah seperti itu:</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\">polls/views.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.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span>\n<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\">HttpResponseRedirect</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\">get_object_or_404</span><span class=\"p\">,</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">generic</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\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">IndexView</span><span class=\"p\">(</span><span class=\"n\">generic</span><span class=\"o\">.</span><span class=\"n\">ListView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;polls/index.html&quot;</span>\n    <span class=\"n\">context_object_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;latest_question_list&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Return the last five published questions.&quot;&quot;&quot;</span>\n        <span class=\"k\">return</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=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DetailView</span><span class=\"p\">(</span><span class=\"n\">generic</span><span class=\"o\">.</span><span class=\"n\">DetailView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Question</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;polls/detail.html&quot;</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ResultsView</span><span class=\"p\">(</span><span class=\"n\">generic</span><span class=\"o\">.</span><span class=\"n\">DetailView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Question</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;polls/results.html&quot;</span>\n\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=\"c1\"># same as above, no changes needed.</span>\n    <span class=\"o\">...</span>\n</code></pre></figure>\n<p>Each generic view needs to know what model it will be acting upon. This is\nprovided using either the <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> attribute (in this example, <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span> <span class=\"pre\">=</span>\n<span class=\"pre\">Question</span></code> for  <code class=\"docutils literal notranslate\"><span class=\"pre\">DetailView</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">ResultsView</span></code>) or by defining the\n<a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_queryset\" title=\"django.views.generic.list.MultipleObjectMixin.get_queryset\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code></a> method (as\nshown in <code class=\"docutils literal notranslate\"><span class=\"pre\">IndexView</span></code>).</p>\n<p>Secara awal, tampilan umum <a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DetailView</span></code></a> menggunakan cetakan dipanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;app</span> <span class=\"pre\">name&gt;/&lt;model</span> <span class=\"pre\">name&gt;_detail.html</span></code>. Di kasus kami, dia akan menggunakan cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;polls/question_detail.html&quot;</span></code>. Atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> digunakan untuk memberitahu Django untuk menggunakan cetakan spesifik dibandingkan dari nama cetakan awal otomatis dibangkitkan. Kami juga menentukan <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> untuk tampilan daftar <code class=\"docutils literal notranslate\"><span class=\"pre\">results</span></code> -- ini memastikan bahwa tampilan hasil dan tampilan rinci mempunyai penampilan ebrbeda ketika dibentuk, bahkan mereka berdua <a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DetailView</span></code></a> dibelakang layar.</p>\n<p>Demikian pula, tampilan umum <a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ListView</span></code></a> menggunakan cetakan awal disebut <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;app</span> <span class=\"pre\">name&gt;/&lt;model</span> <span class=\"pre\">name&gt;_list.html</span></code>; kami menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> untuk memberitahu <a class=\"reference internal\" href=\"/id/6.0/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ListView</span></code></a> untuk menggunakan cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;polls/index.html&quot;</span></code> kami yang ada.</p>\n<p>Dalam bagian sebelumnya dari tutorial, cetakan telah disediakan dengan sebuah konteks yang mengandung variabel konteks <code class=\"docutils literal notranslate\"><span class=\"pre\">question</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">latest_question_list</span></code>. Untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">DetailView</span></code> variabel <code class=\"docutils literal notranslate\"><span class=\"pre\">question</span></code> adalah disediakan otomatis -- sejak kami menggunakan model Django (<code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>), Django dapat menentukan sebuah nama sesuai untuk variabel konteks. Bagaimanapun untuk ListView, variabel konteks dibangkitkan otomatos adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">question_list</span></code>. Untuk menimpa ini kami menyediakan atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">context_object_name</span></code>, menentukan apa yang kita ingin gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">latest_question_list</span></code>. Sebagai sebuah pendekatan alternatif, anda dapat merubah cetakan anda untuk mencocokkan dengan variabel konteks awalan baru -- tetapi itu lebih mudah memberitahu Django untuk menggunakan varaibel anda inginkan.</p>\n<p>Jalankan peladen, dan gunakan aplikasi jejak pendapat baru anda berdasarkan tampilan umum.</p>\n<p>Untuk rincian penuh pada tampilan umum, lihat <a class=\"reference internal\" href=\"/id/6.0/topics/class-based-views/\"><span class=\"doc\">dokumentasi tampilan umum</span></a>.</p>\n<p>Ketika anda nyaman dengan formulir dan tampilan umum, baca <a class=\"reference internal\" href=\"/id/6.0/intro/tutorial05/\"><span class=\"doc\">bagian 5 dari tutorial ini</span></a> untuk mempelajari tentang aplikasi jejak pendapat kami.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-4","toc":[{"title":"Tulis sebuah formulir minimal","anchor":"write-a-minimal-form","children":[]},{"title":"Gunakan tampilan umum: Sedikit kode lebih baik","anchor":"use-generic-views-less-code-is-better","children":[{"title":"Merubah URLconf","anchor":"amend-urlconf","children":[]},{"title":"Merubah tampilan","anchor":"amend-views","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Mulai","url":"/id/6.0/intro/"}],"prev":{"docname":"intro/tutorial03","title":"Menulis aplikasi Django pertama anda, bagian 3","url":"/id/6.0/intro/tutorial03/"},"next":{"docname":"intro/tutorial05","title":"Menulis aplikasi Django pertama anda, bagian 5","url":"/id/6.0/intro/tutorial05/"},"formats":{"html":"/id/6.0/intro/tutorial04/","markdown":"/id/6.0/intro/tutorial04.md","json":"/id/6.0/intro/tutorial04.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/intro/tutorial04.txt","official":"https://docs.djangoproject.com/id/6.0/intro/tutorial04/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}