{"title":"Menangani formulir dengan tampilan berdasarkan-kelas","version":"1.11","locale":"id","docname":"topics/class-based-views/generic-editing","url":"/id/1.11/topics/class-based-views/generic-editing/","canonical":"https://djangodocs.dev/id/1.11/topics/class-based-views/generic-editing/","summary":"Pengolahan formulir umumnya mempunyai 3 jalur: Inisial GET (kosong atau formulir diisi dimuka); POST dengan data tidak sah (khususnya memperlihatkan kembali…","html":"<h1>Menangani formulir dengan tampilan berdasarkan-kelas<a class=\"heading-anchor\" href=\"#form-handling-with-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Pengolahan formulir umumnya mempunyai 3 jalur:</p>\n<ul class=\"simple\">\n<li><p>Inisial GET (kosong atau formulir diisi dimuka)</p></li>\n<li><p>POST dengan data tidak sah (khususnya memperlihatkan kembali formulir dengan kesalahan)</p></li>\n<li><p>POST dengan data sah (pengolahan data dan khususnya pengalihan)</p></li>\n</ul>\n<p>Menerapkan ini anda sendiri sering menghasilkan banyak perulangan kode boilerplate (lihat <a class=\"reference internal\" href=\"/id/1.11/topics/forms/#using-a-form-in-a-view\"><span class=\"std std-ref\">Using a form in a view</span></a>). Untuk menghindai ini, Django menyediakan kumpulan dari tampilan berdasarkan-kelas umum untuk pengolahan formulir.</p>\n<section id=\"basic-forms\">\n<h2>Formulir dasar<a class=\"heading-anchor\" href=\"#basic-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Diberikan formulir kontak sederhana:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>forms.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"forms.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n    message <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>Textarea<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">send_email</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># send email using the self.cleaned_data dictionary</span>\n        <span class=\"k\">pass</span>\n</code></pre></figure>\n<p>Tampilan dapat dibangun menggunakan <code class=\"docutils literal notranslate\">FormView</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>views.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"views.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">myapp.forms</span> <span class=\"kn\">import</span> ContactForm\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> FormView\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactView</span><span class=\"p\">(</span>FormView<span class=\"p\">):</span>\n    template_name <span class=\"o\">=</span> <span class=\"s1\">&#39;contact.html&#39;</span>\n    form_class <span class=\"o\">=</span> ContactForm\n    success_url <span class=\"o\">=</span> <span class=\"s1\">&#39;/thanks/&#39;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        <span class=\"c1\"># This method is called when valid form data has been POSTed.</span>\n        <span class=\"c1\"># It should return an HttpResponse.</span>\n        form<span class=\"o\">.</span>send_email<span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">(</span>ContactView<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n</code></pre></figure>\n<p>Catatan:</p>\n<ul class=\"simple\">\n<li><p>FormView mewarisi <a class=\"reference internal\" href=\"/id/1.11/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\">TemplateResponseMixin</code></a> jadi <a class=\"reference internal\" href=\"/id/1.11/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\">template_name</code></a> dapat digunakan disini.</p></li>\n<li><p>Penerapan awalan untuk <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_valid\" title=\"django.views.generic.edit.FormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a> cukup mengalihkan ke <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.success_url\" title=\"django.views.generic.edit.FormMixin.success_url\"><code class=\"xref py py-attr docutils literal notranslate\">success_url</code></a>.</p></li>\n</ul>\n</section>\n<section id=\"model-forms\">\n<h2>Formulir model<a class=\"heading-anchor\" href=\"#model-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tampilan umum bersinar ketika bekerja dengan model. Tampilan umum ini akan secara otomatis membuat sebuah <a class=\"reference internal\" href=\"/id/1.11/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>, selama mereka dapat bekerya kelas model mana digunakan:</p>\n<ul class=\"simple\">\n<li><p>Jika atribut <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.model\" title=\"django.views.generic.edit.ModelFormMixin.model\"><code class=\"xref py py-attr docutils literal notranslate\">model</code></a> diberikan, kelas model itu akan digunakan.</p></li>\n<li><p>Jika <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_object\" title=\"django.views.generic.detail.SingleObjectMixin.get_object\"><code class=\"xref py py-meth docutils literal notranslate\">get_object()</code></a> mengembalikan sebuah obyek, kelas dari obyek akan digunakan.</p></li>\n<li><p>Jika sebuah <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.queryset\" title=\"django.views.generic.detail.SingleObjectMixin.queryset\"><code class=\"xref py py-attr docutils literal notranslate\">queryset</code></a> diberikan, model untuk queryset itu akan digunakan.</p></li>\n</ul>\n<p>Tampilan formulir model menyediakan sebuah penerapan <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.form_valid\" title=\"django.views.generic.edit.ModelFormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a> yang menyimpan model secara otomatis. Anda dapat menimpa ini jika anda mempunyai persyaratan khusus lainnya; lihat dibawah untuk contoh.</p>\n<p>Anda tidak perlu menyediakan sebuah <code class=\"docutils literal notranslate\">success_url</code> untuk <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/generic-editing/#django.views.generic.edit.CreateView\" title=\"django.views.generic.edit.CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> atau <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/generic-editing/#django.views.generic.edit.UpdateView\" title=\"django.views.generic.edit.UpdateView\"><code class=\"xref py py-class docutils literal notranslate\">UpdateView</code></a> - mereka akan menggunakan <a class=\"reference internal\" href=\"/id/1.11/ref/models/instances/#django.db.models.Model.get_absolute_url\" title=\"django.db.models.Model.get_absolute_url\"><code class=\"xref py py-meth docutils literal notranslate\">get_absolute_url()</code></a> pada obyek model jika tersedia.</p>\n<p>Jika anda ingin menggunakan penyesuaian <a class=\"reference internal\" href=\"/id/1.11/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> (sebagai contoh untuk menambah pengesahan tambahan) cukup setel <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_class\" title=\"django.views.generic.edit.FormMixin.form_class\"><code class=\"xref py py-attr docutils literal notranslate\">form_class</code></a> pada tampilan anda.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Ketika menentukan sebuah penyesuaian kelas formulir, anda harus masih menentukan model, meskipun <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_class\" title=\"django.views.generic.edit.FormMixin.form_class\"><code class=\"xref py py-attr docutils literal notranslate\">form_class</code></a> mungkin berupa sebuah <a class=\"reference internal\" href=\"/id/1.11/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>.</p>\n</aside>\n<p>Pertama kami butuh menambahkan <a class=\"reference internal\" href=\"/id/1.11/ref/models/instances/#django.db.models.Model.get_absolute_url\" title=\"django.db.models.Model.get_absolute_url\"><code class=\"xref py py-meth docutils literal notranslate\">get_absolute_url()</code></a> ke kelas <code class=\"docutils literal notranslate\">Author</code> kami:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_absolute_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> reverse<span class=\"p\">(</span><span class=\"s1\">&#39;author-detail&#39;</span><span class=\"p\">,</span> kwargs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;pk&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span>pk<span class=\"p\">})</span>\n</code></pre></figure>\n<p>Kemudian kami dapat menggunakan <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> dan teman-teman untuk melakukan pekerjaan sebenarnya. Perhatikan bagaimana kami hanya mengkonfigurasi tampilan berdasarkan-kelas umum disini; kami tidak harus menulis logika apapun kami sendiri:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>views.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"views.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> CreateView<span class=\"p\">,</span> UpdateView<span class=\"p\">,</span> DeleteView\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse_lazy\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorCreate</span><span class=\"p\">(</span>CreateView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n    fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorUpdate</span><span class=\"p\">(</span>UpdateView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n    fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorDelete</span><span class=\"p\">(</span>DeleteView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n    success_url <span class=\"o\">=</span> reverse_lazy<span class=\"p\">(</span><span class=\"s1\">&#39;author-list&#39;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Kami harus menggunakan <a class=\"reference internal\" href=\"/id/1.11/ref/urlresolvers/#django.urls.reverse_lazy\" title=\"django.urls.reverse_lazy\"><code class=\"xref py py-func docutils literal notranslate\">reverse_lazy()</code></a> disini, tidak hanya <code class=\"docutils literal notranslate\">reverse()</code> sebagai url tidak dimuat ketika berkas diimpor.</p>\n</aside>\n<p>Atribut <code class=\"docutils literal notranslate\">fields</code> bekerja cara sama seperti atribut <code class=\"docutils literal notranslate\">fields</code> pada kelas <code class=\"docutils literal notranslate\">Meta</code> sebelah dalam pada <a class=\"reference internal\" href=\"/id/1.11/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>. Meskipun anda menentukan kelas formulir di cara lain, atribut dibutuhkan dan tampilan akan munculkan sebuah pengecualian <a class=\"reference internal\" href=\"/id/1.11/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a> jika itu tidak.</p>\n<p>Jika anda menentukan kedua atribut <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.fields\" title=\"django.views.generic.edit.ModelFormMixin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> dan <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_class\" title=\"django.views.generic.edit.FormMixin.form_class\"><code class=\"xref py py-attr docutils literal notranslate\">form_class</code></a>, sebuah pengecualian <a class=\"reference internal\" href=\"/id/1.11/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a> akan dimunculkan.</p>\n<p>Akhirnya, kami mengaitkan tampilan baru ini kedalam URLconf:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>urls.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"urls.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf.urls</span> <span class=\"kn\">import</span> url\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.views</span> <span class=\"kn\">import</span> AuthorCreate<span class=\"p\">,</span> AuthorUpdate<span class=\"p\">,</span> AuthorDelete\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    url<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;author/add/$&#39;</span><span class=\"p\">,</span> AuthorCreate<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;author-add&#39;</span><span class=\"p\">),</span>\n    url<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;author/(?P&lt;pk&gt;[0-9]+)/$&#39;</span><span class=\"p\">,</span> AuthorUpdate<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;author-update&#39;</span><span class=\"p\">),</span>\n    url<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;author/(?P&lt;pk&gt;[0-9]+)/delete/$&#39;</span><span class=\"p\">,</span> AuthorDelete<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;author-delete&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Tampilan ini mewarisi class:~django.views.generic.detail.SingleObjectTemplateResponseMixin yang menggunakan <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\" title=\"django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">template_name_suffix</code></a> untuk membangun <a class=\"reference internal\" href=\"/id/1.11/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\">template_name</code></a> berdasarkan pada model.</p>\n<p>Di contoh ini:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> dan <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/flattened-index/#UpdateView\" title=\"UpdateView\"><code class=\"xref py py-class docutils literal notranslate\">UpdateView</code></a> menggunakan <code class=\"docutils literal notranslate\">myapp/author_form.html</code></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/flattened-index/#DeleteView\" title=\"DeleteView\"><code class=\"xref py py-class docutils literal notranslate\">DeleteView</code></a> menggunakan <code class=\"docutils literal notranslate\">myapp/author_confirm_delete.html</code></p></li>\n</ul>\n<p>Jika anda berharap untuk mempunyai cetakan terpisah untuk <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> dan <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/flattened-index/#UpdateView\" title=\"UpdateView\"><code class=\"xref py py-class docutils literal notranslate\">UpdateView</code></a>, anda dapat menyetel antara <a class=\"reference internal\" href=\"/id/1.11/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\">template_name</code></a> atau <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\" title=\"django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">template_name_suffix</code></a> pada kelas tampilan anda.</p>\n</aside>\n</section>\n<section id=\"models-and-request-user\">\n<h2>Models dan <code class=\"docutils literal notranslate\">request.user</code><a class=\"heading-anchor\" href=\"#models-and-request-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Untuk melacak pengguna yang membuat sebuah obyek menggunakan sebuah <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a>, anda dapat menggunakan sebuah penyesuaian <a class=\"reference internal\" href=\"/id/1.11/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> untuk melakukan ini. Pertama, tambah hubungan foreign key pada model:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    created_by <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>User<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></figure>\n<p>Di tampilan, pastikan bahwa anda tidak menyertakan <code class=\"docutils literal notranslate\">created_by</code> di daftar dari bidang untuk menyunting, dan menimpa <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.form_valid\" title=\"django.views.generic.edit.ModelFormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a> untuk menambah pengguna:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>views.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"views.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> CreateView\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorCreate</span><span class=\"p\">(</span>CreateView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n    fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        form<span class=\"o\">.</span>instance<span class=\"o\">.</span>created_by <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>user\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">(</span>AuthorCreate<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n</code></pre></figure>\n<p>Catata bahwa anda akan butuh <a class=\"reference internal\" href=\"/id/1.11/topics/class-based-views/intro/#id1\"><span class=\"std std-ref\">decorate this view</span></a> menggunakan <a class=\"reference internal\" href=\"/id/1.11/topics/auth/default/#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\">login_required()</code></a>, atau cara lain menangani pengguna tidak berhak di <a class=\"reference internal\" href=\"/id/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.form_valid\" title=\"django.views.generic.edit.ModelFormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a>.</p>\n</section>\n<section id=\"ajax-example\">\n<h2>Contoh AJAX<a class=\"heading-anchor\" href=\"#ajax-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ini adalah contoh sederhana menunjukkan bagaimana anda mungkin pergi tentang menerapkan sebuah formulir yang bekerja untuk permintaan AJAX sama seperti formulir POST 'normal':</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=\"nn\">django.http</span> <span class=\"kn\">import</span> JsonResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> CreateView\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n<span class=\"k\">class</span> <span class=\"nc\">AjaxableResponseMixin</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Mixin to add AJAX support to a form.</span>\n<span class=\"sd\">    Must be used with an object-based FormView (e.g. CreateView)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">def</span> <span class=\"nf\">form_invalid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        response <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span>AjaxableResponseMixin<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>form_invalid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>is_ajax<span class=\"p\">():</span>\n            <span class=\"k\">return</span> JsonResponse<span class=\"p\">(</span>form<span class=\"o\">.</span>errors<span class=\"p\">,</span> status<span class=\"o\">=</span><span class=\"mi\">400</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> response\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        <span class=\"c1\"># We make sure to call the parent&#39;s form_valid() method because</span>\n        <span class=\"c1\"># it might do some processing (in the case of CreateView, it will</span>\n        <span class=\"c1\"># call form.save() for example).</span>\n        response <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span>AjaxableResponseMixin<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>is_ajax<span class=\"p\">():</span>\n            data <span class=\"o\">=</span> <span class=\"p\">{</span>\n                <span class=\"s1\">&#39;pk&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span>object<span class=\"o\">.</span>pk<span class=\"p\">,</span>\n            <span class=\"p\">}</span>\n            <span class=\"k\">return</span> JsonResponse<span class=\"p\">(</span>data<span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> response\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorCreate</span><span class=\"p\">(</span>AjaxableResponseMixin<span class=\"p\">,</span> CreateView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n    fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n</section>","rootId":"form-handling-with-class-based-views","toc":[{"title":"Formulir dasar","anchor":"basic-forms","children":[]},{"title":"Formulir model","anchor":"model-forms","children":[]},{"title":"Models dan request.user","anchor":"models-and-request-user","children":[]},{"title":"Contoh AJAX","anchor":"ajax-example","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/1.11/topics/"},{"docname":"topics/class-based-views/index","title":"Tampilan berdasarkan-kelas","url":"/id/1.11/topics/class-based-views/"}],"prev":{"docname":"topics/class-based-views/generic-display","title":"Tampilan umum berdasarkan kelas siap-pakai","url":"/id/1.11/topics/class-based-views/generic-display/"},"next":{"docname":"topics/class-based-views/mixins","title":"Menggunakan mixin dengan tampilan berdasarkan-kelas","url":"/id/1.11/topics/class-based-views/mixins/"},"formats":{"html":"/id/1.11/topics/class-based-views/generic-editing/","markdown":"/id/1.11/topics/class-based-views/generic-editing.md","json":"/id/1.11/topics/class-based-views/generic-editing.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/topics/class-based-views/generic-editing.txt","official":"https://docs.djangoproject.com/id/1.11/topics/class-based-views/generic-editing/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}