{"title":"Menulis aplikasi Django pertama anda, bagian 4","version":"2.2","locale":"id","docname":"intro/tutorial04","url":"/id/2.2/intro/tutorial04/","canonical":"https://djangodocs.dev/id/2.2/intro/tutorial04/","summary":"Tutorial ini mulai dimana Tutorial 3 ditinggalkan. Kami sedang melanjutkan aplikasi jejak pendapat Jaringan dan akan fokus pada bentuk pengolahan sederhana dan…","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 mulai dimana <a class=\"reference internal\" href=\"/id/2.2/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a> ditinggalkan. Kami sedang melanjutkan aplikasi jejak pendapat Jaringan dan akan fokus pada bentuk pengolahan sederhana dan meringkas kode kami.</p>\n<section id=\"write-a-simple-form\">\n<h2>Tulis formulir sederhana<a class=\"heading-anchor\" href=\"#write-a-simple-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\">polls/templates/polls/detail.html</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=\"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\n<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=\"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\">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 mengatur <code class=\"docutils literal notranslate\"><span class=\"pre\">tindakan</span></code> formulir ke <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 menyetel <code class=\"docutils literal notranslate\"><span class=\"pre\">method=&quot;post&quot;</span></code>. Menggunakan method=&quot;post&quot;` (sebagai lawan dari <code class=\"docutils literal notranslate\"><span class=\"pre\">method=&quot;get&quot;</span></code>) adalah sangat penting, karena aksi dari pengajuan formulir ini akan merubah data sisi-peladem. Kapanpun anda membuat formulir yang merubah data sisi-peladen, gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">method=&quot;post&quot;</span></code>. Tip ini bukan khusus pada Django; ini hanya bagus untuk praktik pengembangan Jaringan.</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 mempunyai efek merubah data), kami harus khawatir tentang Pemalsuan Permintaan Lintas Situs. Untungnya, anda tidak harus khawatir terlalu keras, karena Django datang dengan sistem sangat mudah-digunakan untuk melindungi terhadapnya. Pendeknya, semua formulir POST disasarkan pada URL internal harus menggunakan etiket cetakan <a class=\"reference internal\" href=\"/id/2.2/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/2.2/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\">polls/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&lt;int:question_id&gt;/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</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\">polls/views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">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<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=\"s1\">&#39;choice&#39;</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><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>\n            <span class=\"s1\">&#39;question&#39;</span><span class=\"p\">:</span> <span class=\"n\">question</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;error_message&#39;</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=\"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=\"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=\"s1\">&#39;polls:results&#39;</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/2.2/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/2.2/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/2.2/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/2.2/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>Setelah menaikkan jumlah pilihan, kode mengembalikan sebuah <a class=\"reference internal\" href=\"/id/2.2/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/2.2/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/2.2/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 komentar Phyton diatas tunjukkan, anda harus selalu mengembalikan sebuah <a class=\"reference internal\" href=\"/id/2.2/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. Tip ini bukan khusus pada Djangol ini hanya bagus praktik pengembangan Jaringan.</p>\n</li>\n<li><p>Kami sedang menggunakan fungsi <a class=\"reference internal\" href=\"/id/2.2/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/2.2/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/2.2/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>, panggilan <a class=\"reference internal\" href=\"/id/2.2/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=\"s1\">&#39;/polls/3/results/&#39;</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/2.2/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/2.2/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/2.2/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/2.2/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\">polls/views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">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=\"s1\">&#39;polls/results.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>Ini hampir tepat sama seperti tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">detail()</span></code> dari <a class=\"reference internal\" href=\"/id/2.2/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\">polls/templates/polls/results.html</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<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Kode untuk tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">vote()</span></code> kami mempunyai masalah kecil. Dia pertama mendapatkan obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">selected_choice</span></code> dari basistada, lalu menghitung nilai baru dari <code class=\"docutils literal notranslate\"><span class=\"pre\">votes</span></code>, dan lalu menyimpan kembali ke basisdata. Jika dua pengguna dari situs jaringan anda mencoba memilih <em>tepatnya waktu sama</em>, ini mungkin menjadi salah: nilai sama, mari kita katakan 42, akan ditarik untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">votes</span></code>. Lalu, untuk kedua pengguna nilai baru dari 43 dihitung dan disimpan, tetapi 44 akan menjadi nilai diharapkan.</p>\n<p>Ini disebut <em>kondisi jarang</em>. Jika anda tertarik, anda dapat membaca <a class=\"reference internal\" href=\"/id/2.2/ref/models/expressions/#avoiding-race-conditions-using-f\"><span class=\"std std-ref\">Menghindari kondisi balapan menggunakan F()</span></a> untuk mempelajari bagaimana anda dapat mengatasi masalah ini.</p>\n</aside>\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> (dari <a class=\"reference internal\" href=\"/id/2.2/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>) dan <code class=\"docutils literal notranslate\"><span class=\"pre\">results()</span></code> adalah sangat sederhana -- dan, seperti disebutkan diatas, berlebihan. Tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">index()</span></code>, yang menampilkan daftar jejak pendapat, adalah mirip.</p>\n<p>Tampilan ini mewakili kasus umum dari pengembangan Jaringan dasar: mendapatkan data dari basisdata menurut parameter yang dilewatkan di URL, memuat sebuah cetakan dan mengembalikan cetakan dibuat. Karena ini adalah sudah umum, Django menyediakan jalan pintas, dipanggil sistem &quot;tampilan umum&quot;.</p>\n<p>Tampilan umum meringkaskan corak umum ke titik dimana anda tidak butuh menulis kode Phyton untuk menulis sebuah aplikasi.</p>\n<p>Mari kita merubah aplikasi jejak pendapat kami untuk menggunakan sistem tampilan umum, jadi kami dapat menghapus kumpulan kode sendiri. Kami akan hanya mengambil beberapa langkah untuk membuat pergantian. 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\">polls/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">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=\"s1\">&#39;polls&#39;</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=\"s1\">&#39;&#39;</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=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&lt;int:pk&gt;/&#39;</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=\"s1\">&#39;detail&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&lt;int:pk&gt;/results/&#39;</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=\"s1\">&#39;results&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&lt;int:question_id&gt;/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>Catata bahwa nama dari pola tercocok dalam jalur string dari pola kedua dan ketiga telah berubah dari <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>`` to <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a><a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a>.</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\">polls/views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">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=\"s1\">&#39;polls/index.html&#39;</span>\n    <span class=\"n\">context_object_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;latest_question_list&#39;</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=\"s1\">&#39;-pub_date&#39;</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=\"s1\">&#39;polls/detail.html&#39;</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=\"s1\">&#39;polls/results.html&#39;</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=\"o\">...</span> <span class=\"c1\"># same as above, no changes needed.</span>\n</code></pre></figure>\n<p>Kami sedang menggunaan dua tampilan umum disini: <a class=\"reference internal\" href=\"/id/2.2/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> dan <a class=\"reference internal\" href=\"/id/2.2/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>. Masing-masing, kedua tampilan tersebut meringkaskan &quot;menampilkan daftar obyek&quot; dan &quot;menampilan halaman rinci untuk jenis khusus dari obyek.&quot;</p>\n<ul class=\"simple\">\n<li><p>Setiap tampilan umum butuh diketahui model apa akan bertindak. Ini disediakan menggunakan atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code>.</p></li>\n<li><p>Tampilan umum <a class=\"reference internal\" href=\"/id/2.2/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> mengharapkan nilai kunci utama ditangkap dari URL untuk dipanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pk&quot;</span></code>, jadi kami telah merubah <code class=\"docutils literal notranslate\"><span class=\"pre\">question_id</span></code> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code> untuk tampilan umum.</p></li>\n</ul>\n<p>Secara awal, tampilan umum <a class=\"reference internal\" href=\"/id/2.2/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/2.2/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/2.2/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/2.2/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>Di bagian sebelumnya dari tutorial, cetakan telah disediakan dengan 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> disediakan otomatis -- sejak kami menggunakan model Django (<code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>), Django dapat menentukan nama yang sesuai untuk variabel konteks. Bagaimanapun, untuk ListView, otomatis membangkitkan variabel konteks 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 bahwa kami ingin menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">latest_question_list</span></code>. Sebagai pendekatan lain, anda dapat merubah cetakan anda untuk mencocokkan variabel konteks awal -- tetap akan lebih mudah untuk hanya mengatakan Django menggunakan variabel 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/2.2/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/2.2/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 formulir sederhana","anchor":"write-a-simple-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/2.2/intro/"}],"prev":{"docname":"intro/tutorial03","title":"Menulis aplikasi Django pertama anda, bagian 3","url":"/id/2.2/intro/tutorial03/"},"next":{"docname":"intro/tutorial05","title":"Menulis aplikasi Django pertama anda, bagian 5","url":"/id/2.2/intro/tutorial05/"},"formats":{"html":"/id/2.2/intro/tutorial04/","markdown":"/id/2.2/intro/tutorial04.md","json":"/id/2.2/intro/tutorial04.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/intro/tutorial04.txt","official":"https://docs.djangoproject.com/id/2.2/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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}