{"title":"Perkenalan ke tampilan berdasarkan-kelas","version":"3.2","locale":"id","docname":"topics/class-based-views/intro","url":"/id/3.2/topics/class-based-views/intro/","canonical":"https://djangodocs.dev/id/3.2/topics/class-based-views/intro/","summary":"Tampilan berdasarkan-kelas menyediakan cara alternatif untuk menerapkan tampilan sebagai obyek Python daripada fungsi. Mereka tidak mengganti tampilan…","html":"<h1>Perkenalan ke tampilan berdasarkan-kelas<a class=\"heading-anchor\" href=\"#introduction-to-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Tampilan berdasarkan-kelas menyediakan cara alternatif untuk menerapkan tampilan sebagai obyek Python daripada fungsi. Mereka tidak mengganti tampilan berdasarkan-fungsi, tetapi mempunyai perbedaan dan keuntungan tertentu ketika dibandingkan pada tampilan berdasarkan-fungsi:</p>\n<ul class=\"simple\">\n<li><p>Kode organisasi terkait pada metode HTTP tertentu (<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, dll.) dapat dialamatkan oleh metode terpisah sebagai gantinya dari percabangan bersyarat.</p></li>\n<li><p>Teknik-teknik berorientasi obyek seperti mixin (banyak warisan) dapat digunakan pada kode faktor kedalam komponen digunakan kembali.</p></li>\n</ul>\n<section id=\"the-relationship-and-history-of-generic-views-class-based-views-and-class-based-generic-views\">\n<h2>Hubungan dan riwayat dari tampilan umum, tampilan berdasarkan-kelas, dan tampilan umum berdasarkan-kelas<a class=\"heading-anchor\" href=\"#the-relationship-and-history-of-generic-views-class-based-views-and-class-based-generic-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dalam permulaan ada hanya kontrak fungsi tampilan, Django melewatkan fungsi anda sebuah <a class=\"reference internal\" href=\"/id/3.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> dan berharap kembali sebuah <a class=\"reference internal\" href=\"/id/3.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>. Ini adalah perpanjangan dari apa Django sediakan.</p>\n<p>Lebih awal pada itu telah dikenali dimana ada dialek umum dan pola ditemukan di pengembangan tampilan. Tampilan umum berdasarkan-fungsi telah diperkenalkan untuk meringkas pola ini dan pengembangan tampilan mudah untuk kasus-kasus umum.</p>\n<p>The problem with function-based generic views is that while they covered the\nsimple cases well, there was no way to extend or customize them beyond some\nconfiguration options, limiting their usefulness in many real-world\napplications.</p>\n<p>Tampilan umum berdasarkan-kelas telah dibuat dengan tujuan sama sebagai tampilan umum berdasarkan-fungsi, untuk membuat tampilan pengembangan lebih mudah. Bagaimanapun, cara pemecahan diterapkan, melalui penggunaan dari mixin, menyediakan sebuah alat bantu yang menghasilkan di tampilan umum berdasarkan-kelas menjadi lebih diperpanjang dan lentur daripada pasangan berdasarkan-fungsi mereka.</p>\n<p>If you have tried function based generic views in the past and found them\nlacking, you should not think of class-based generic views as a class-based\nequivalent, but rather as a fresh approach to solving the original problems\nthat generic views were meant to solve.</p>\n<p>The toolkit of base classes and mixins that Django uses to build class-based\ngeneric views are built for maximum flexibility, and as such have many hooks in\nthe form of default method implementations and attributes that you are unlikely\nto be concerned with in the simplest use cases. For example, instead of\nlimiting you to a class-based attribute for <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code>, the implementation\nuses a <code class=\"docutils literal notranslate\"><span class=\"pre\">get_form</span></code> method, which calls a <code class=\"docutils literal notranslate\"><span class=\"pre\">get_form_class</span></code> method, which in\nits default implementation returns the <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> attribute of the class.\nThis gives you several options for specifying what form to use, from an\nattribute, to a fully dynamic, callable hook. These options seem to add hollow\ncomplexity for simple situations, but without them, more advanced designs would\nbe limited.</p>\n</section>\n<section id=\"using-class-based-views\">\n<h2>Menggunakan tampilan berdasarkan-kelas<a class=\"heading-anchor\" href=\"#using-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pada intinya, tampilan berdasarkan-kelas mengizinkan anda menanggapi ke permintaan HTTP berbeda dengan metode instance kelas berbeda, daripada dengan kode cabang bersyarat didalam fungsi tampilan tunggal.</p>\n<p>Jadi dimana kode untuk menangani HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> di sebuah fungsi tampilan akan terlihat 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=\"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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;GET&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># &lt;view logic&gt;</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s1\">&#39;result&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Di tampilan berdasarkan-kelas, ini akan menjadi:</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=\"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.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyView</span><span class=\"p\">(</span><span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"c1\"># &lt;view logic&gt;</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s1\">&#39;result&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Because Django's URL resolver expects to send the request and associated\narguments to a callable function, not a class, class-based views have an\n<a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> class method which returns a\nfunction that can be called when a request arrives for a URL matching the\nassociated pattern. The function creates an instance of the class, calls\n<a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View.setup\" title=\"django.views.generic.base.View.setup\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">setup()</span></code></a> to initialize its attributes, and\nthen calls its <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">dispatch()</span></code></a> method.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">dispatch</span></code> looks at the request to determine whether it is a <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, etc, and relays the request to a matching method if one is defined,\nor raises <a class=\"reference internal\" href=\"/id/3.2/ref/request-response/#django.http.HttpResponseNotAllowed\" title=\"django.http.HttpResponseNotAllowed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseNotAllowed</span></code></a> if not:</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=\"c1\"># urls.py</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\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyView</span>\n\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;about/&#39;</span><span class=\"p\">,</span> <span class=\"n\">MyView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Itu perlu dicatat bahwa apa metode anda kembalikan mirip ke apa anda kembalikan dari tampilan berdasarkan-fungsi, yaitu beberapa formulir dari <a class=\"reference internal\" href=\"/id/3.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>. Ini berarti bahwa obyek <a class=\"reference internal\" href=\"/id/3.2/topics/http/shortcuts/\"><span class=\"doc\">http shortcuts</span></a> atau <a class=\"reference internal\" href=\"/id/3.2/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> sah digunakan didalam tampilan berdasarkan-kelas.</p>\n<p>Selagi tampilan berdasarkan-kelas paling rendah tidak membutuhkan atribut kelas apapun untuk melakukan pekerjaannya, atribut kelas berguna di banyak perancangan berdasarkan-kelas, dan ada dua cara mengkonfigurasi atau mensetel atribut kelas.</p>\n<p>Pertama adalah cara Python standar dari mensubkelaskan dan menimpa atribut dan metode di subkelas. Sehingga jika induk anda mempunyai sebuah atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">greeting</span></code> 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=\"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.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">GreetingView</span><span class=\"p\">(</span><span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"n\">greeting</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Good Day&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">greeting</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Anda dapat menimpa itu di subkelas:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MorningGreetingView</span><span class=\"p\">(</span><span class=\"n\">GreetingView</span><span class=\"p\">):</span>\n    <span class=\"n\">greeting</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Morning to ya&quot;</span>\n</code></pre></div>\n<p>Pilihan lain adalah mengkonfigurasi atribut kelas sebagai argumen kata kunci pada panggailan <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> di URLconf:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;about/&#39;</span><span class=\"p\">,</span> <span class=\"n\">GreetingView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">greeting</span><span class=\"o\">=</span><span class=\"s2\">&quot;G&#39;day&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Selagi kelas anda diinstasiasikan untuk setiap permintaan dikirimkan ke itu, atribut kelas menyetel melalui titik masukan <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> dikonfigurasikan hanya sekali pada waktu URL anda diimpor.</p>\n</aside>\n</section>\n<section id=\"using-mixins\">\n<h2>Menggunakan mixin<a class=\"heading-anchor\" href=\"#using-mixins\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Mixin adalah sebuah formulit dari banyak warisan dimana perilaku dan atribut dari banyak kelas-kelas induk dapat dipadukan</p>\n<p>Sebagai contoh, di tampilan berdasarkan-kelas umum adalah sebuah mixin dipanggil <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin\" title=\"django.views.generic.base.TemplateResponseMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponseMixin</span></code></a> yang tujuan utamanya adalah menentukan metode <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response\" title=\"django.views.generic.base.TemplateResponseMixin.render_to_response\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">render_to_response()</span></code></a>. Ketika memadukan dengan perilaku dari kelas dasar <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">View</span></code></a>, hasil adalah kelas <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code></a> yang akan mengirim permintaan ke metode pencocokan sesuai (sebuah perilaku ditentukan di kelas dasar <code class=\"docutils literal notranslate\"><span class=\"pre\">View</span></code>), dan itu mempunyai sebuah metode <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response\" title=\"django.views.generic.base.TemplateResponseMixin.render_to_response\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">render_to_response()</span></code></a> yang menggunakan sebuah atribut <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.template_name\" title=\"django.views.generic.base.TemplateResponseMixin.template_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name</span></code></a> untuk mengembalikan sebuah obyek <a class=\"reference internal\" href=\"/id/3.2/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> (sebuah perilaku ditentukan di <code class=\"docutils literal notranslate\"><span class=\"pre\">TemplateResponseMixin</span></code>).</p>\n<p>Mixin adalah sebuah cara istimewa dari menggunakan kembali kode terhadap banyak kelas, tetapi mereka datang dengan beberapa biaya. Semakin kode anda tersebar diantara mixin, semakin keras itu akan dibaca kelas anak dan mengetahui apa yang sebenarnya itu lakukan, dan semakin keras itu akan diketahui metode mana dari mixin mana untuk ditimpa jika anda mensubkelaskan sesuatu yang mempunyai pohon warisan dalam.</p>\n<p>Catat juga bahwa anda dapat hanya mewarisi dari satu tampilan umum - yaitu, hanya satu kelas induk mungkin mewarisi dari <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">View</span></code></a> dan sisa (jika ada) harus berupa mixin. Mencoba mewarisi lebih dari satu kelas yang mewarisi dari <code class=\"docutils literal notranslate\"><span class=\"pre\">View</span></code> - sebagai contoh, mencoba menggunakan sebuah formulir pada atas dari daftar dan memadukan <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView\" title=\"django.views.generic.edit.ProcessFormView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ProcessFormView</span></code></a> dan <a class=\"reference internal\" href=\"/id/3.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> - tidak bekerja sesuai harapan.</p>\n</section>\n<section id=\"handling-forms-with-class-based-views\">\n<h2>Menangani formulir dengan tampilan berdasarkan-kelas<a class=\"heading-anchor\" href=\"#handling-forms-with-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sebuah dasar tampilan berdasarkan-fungsi yang menangani formulir mungkin terlihat 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=\"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\">render</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyForm</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">myview</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">MyForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"c1\"># &lt;process form cleaned data&gt;</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">MyForm</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;key&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;value&#39;</span><span class=\"p\">})</span>\n\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;form_template.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Tampilan berdasarkan-kelas yang mirip mungkin terlihat 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=\"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\">render</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\">View</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyForm</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyFormView</span><span class=\"p\">(</span><span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"n\">form_class</span> <span class=\"o\">=</span> <span class=\"n\">MyForm</span>\n    <span class=\"n\">initial</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;key&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;value&#39;</span><span class=\"p\">}</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;form_template.html&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">form_class</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial</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=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">template_name</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">post</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">form_class</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"c1\"># &lt;process form cleaned data&gt;</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/&#39;</span><span class=\"p\">)</span>\n\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=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">template_name</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>This is a minimal case, but you can see that you would then have the option\nof customizing this view by overriding any of the class attributes, e.g.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code>, via URLconf configuration, or subclassing and overriding one or\nmore of the methods (or both!).</p>\n</section>\n<section id=\"decorating-class-based-views\">\n<h2>Menghias tampilan berdasarkan-kelas<a class=\"heading-anchor\" href=\"#decorating-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tambahan dari tampilan berdasarkan-kelas tidak terbatas menggunakan mixin. Anda dapat juga menggunakan penghias. Sejak tampilan berdasarkan-kelas bukan fungsi, mengias mereka bekerja secara berbeda tergantung pada jika anda sedang menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">as_view()</span></code> atau membuat sebuah subkelas.</p>\n<section id=\"decorating-in-urlconf\">\n<h3>Menghias URLconf<a class=\"heading-anchor\" href=\"#decorating-in-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can adjust class-based views by decorating the result of the\n<a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> method. The easiest place to do\nthis is in the URLconf where you deploy your view:</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_required</span><span class=\"p\">,</span> <span class=\"n\">permission_required</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">VoteView</span>\n\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;about/&#39;</span><span class=\"p\">,</span> <span class=\"n\">login_required</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">template_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;secret.html&quot;</span><span class=\"p\">))),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;vote/&#39;</span><span class=\"p\">,</span> <span class=\"n\">permission_required</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls.can_vote&#39;</span><span class=\"p\">)(</span><span class=\"n\">VoteView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">())),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Pendekatan ini memberlakukan penghias pada dasar per-instance. Jika anda ingin setiap instance dari tampilan dihias, anda butuh mengambil pendekatan berbeda.</p>\n</section>\n<section id=\"decorating-the-class\">\n<span id=\"id1\"></span><h3>Menghias kelas<a class=\"heading-anchor\" href=\"#decorating-the-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Untuk menghias setiap instance dari tampilan berdasarkan-kelas, anda butuh menghias pengertian kelas itu sendiri. Untuk melakukan ini anda berlakukan penghias ke metode <a class=\"reference internal\" href=\"/id/3.2/ref/class-based-views/base/#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">dispatch()</span></code></a> dari kelas.</p>\n<p>Sebuah metode pada sebuah kelas tidak agak sama seperti fungsi berdiri sendiri, jadi anda tidak hanya memberlakukan penghias fungsi ke metode -- anda butuh merubah itu menjadi penghias metode dahulu. Penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">method_decorator</span></code> merubah sebuah penghias  fungsi kedalam penghias metode sehingga itu dapat digunakan pada metode instance. Sebagai contoh:</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_required</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">method_decorator</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ProtectedView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;secret.html&#39;</span>\n\n    <span class=\"nd\">@method_decorator</span><span class=\"p\">(</span><span class=\"n\">login_required</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">dispatch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">dispatch</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Atau, lebih ringkas, anda dapat menghias kelas dan melewatkan nama dari metode untuk di hias sebagai argumen kata kunci <code class=\"docutils literal notranslate\"><span class=\"pre\">name</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=\"nd\">@method_decorator</span><span class=\"p\">(</span><span class=\"n\">login_required</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;dispatch&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ProtectedView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;secret.html&#39;</span>\n</code></pre></div>\n<p>Jika anda mempunyai sekumpulan penghias umum digunakan di beberapa tempat, anda dapat menentukan daftar atau tuple dari penghias dan menggunakan ini sebagai gantinya meminta <code class=\"docutils literal notranslate\"><span class=\"pre\">method_decorator()</span></code> berulang kali. Kedua kelas ini adalah setara:</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\">decorators</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">never_cache</span><span class=\"p\">,</span> <span class=\"n\">login_required</span><span class=\"p\">]</span>\n\n<span class=\"nd\">@method_decorator</span><span class=\"p\">(</span><span class=\"n\">decorators</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;dispatch&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ProtectedView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;secret.html&#39;</span>\n\n<span class=\"nd\">@method_decorator</span><span class=\"p\">(</span><span class=\"n\">never_cache</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;dispatch&#39;</span><span class=\"p\">)</span>\n<span class=\"nd\">@method_decorator</span><span class=\"p\">(</span><span class=\"n\">login_required</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;dispatch&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ProtectedView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;secret.html&#39;</span>\n</code></pre></div>\n<p>Penghias akan mengolah sebuah permintaan dalam urutan mereka dilewatkan ke penghias. Dalam contoh, <code class=\"docutils literal notranslate\"><span class=\"pre\">never_cache()</span></code> akan mengolah permintaan sebelum <code class=\"docutils literal notranslate\"><span class=\"pre\">login_required()</span></code>.</p>\n<p>In this example, every instance of <code class=\"docutils literal notranslate\"><span class=\"pre\">ProtectedView</span></code> will have login\nprotection. These examples use <code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code>, however, the same behavior\ncan be obtained by using\n<a class=\"reference internal\" href=\"/id/3.2/topics/auth/default/#django.contrib.auth.mixins.LoginRequiredMixin\" title=\"django.contrib.auth.mixins.LoginRequiredMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LoginRequiredMixin</span></code></a>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">method_decorator</span></code> melewatkan <code class=\"docutils literal notranslate\"><span class=\"pre\">*args</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> sebagai parameter untuk menghiasi metode pada kelas. Jika metode anda tidak menerima sekumpulan cocok dari parameter itu akan memunculkan sebuah pengecualian <code class=\"docutils literal notranslate\"><span class=\"pre\">TypeError</span></code>.</p>\n</aside>\n</section>\n</section>","rootId":"introduction-to-class-based-views","toc":[{"title":"Hubungan dan riwayat dari tampilan umum, tampilan berdasarkan-kelas, dan tampilan umum berdasarkan-kelas","anchor":"the-relationship-and-history-of-generic-views-class-based-views-and-class-based-generic-views","children":[]},{"title":"Menggunakan tampilan berdasarkan-kelas","anchor":"using-class-based-views","children":[]},{"title":"Menggunakan mixin","anchor":"using-mixins","children":[]},{"title":"Menangani formulir dengan tampilan berdasarkan-kelas","anchor":"handling-forms-with-class-based-views","children":[]},{"title":"Menghias tampilan berdasarkan-kelas","anchor":"decorating-class-based-views","children":[{"title":"Menghias URLconf","anchor":"decorating-in-urlconf","children":[]},{"title":"Menghias kelas","anchor":"decorating-the-class","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/3.2/topics/"},{"docname":"topics/class-based-views/index","title":"Tampilan berdasarkan-kelas","url":"/id/3.2/topics/class-based-views/"}],"prev":{"docname":"topics/class-based-views/index","title":"Tampilan berdasarkan-kelas","url":"/id/3.2/topics/class-based-views/"},"next":{"docname":"topics/class-based-views/generic-display","title":"Tampilan umum berdasarkan kelas siap-pakai","url":"/id/3.2/topics/class-based-views/generic-display/"},"formats":{"html":"/id/3.2/topics/class-based-views/intro/","markdown":"/id/3.2/topics/class-based-views/intro.md","json":"/id/3.2/topics/class-based-views/intro.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/topics/class-based-views/intro.txt","official":"https://docs.djangoproject.com/id/3.2/topics/class-based-views/intro/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}