{"title":"Láimhseáil foirme le tuairimí rangbhunaithe","version":"5.2","locale":"ga","docname":"topics/class-based-views/generic-editing","url":"/ga/5.2/topics/class-based-views/generic-editing/","canonical":"https://djangodocs.dev/ga/5.2/topics/class-based-views/generic-editing/","summary":"De ghnáth bíonn 3 bhealach ag próiseáil foirme GET tosaigh (foirm bán nó réamh-phobail) POST le sonraí neamhbhailí (de ghnáth foirm athtaispeáint le hearráidí) POST…","html":"<h1>Láimhseáil foirme le tuairimí rangbhunaithe<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>De ghnáth bíonn 3 bhealach ag próiseáil foirme</p>\n<ul class=\"simple\">\n<li><p>GET tosaigh (foirm bán nó réamh-phobail)</p></li>\n<li><p>POST le sonraí neamhbhailí (de ghnáth foirm athtaispeáint le hearráidí)</p></li>\n<li><p>POST le sonraí bailí (próiseáil na sonraí agus athreorú de ghnáth)</p></li>\n</ul>\n<p>&lt;using-a-form-in-a-view&gt;Is minic a bhíonn go leor cód boilerplate arís agus arís eile mar thoradh air seo a chur i bhfeidhm tú féin (féach: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>Foirm a úsáid i radharc <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>). Chun cabhrú leis seo a sheachaint, soláthraíonn Django bailiúchán de thuairimí cineálacha bunaithe ar rang le haghaidh próiseála foirme.</p>\n<section id=\"basic-forms\">\n<h2>Foirmeacha bunús<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>Mar gheall ar fhoirm teagmhála:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">foirme.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Textarea</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </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>Is féidir an radharc a thógáil ag baint úsáide as <code class=\"docutils literal notranslate\"><span class=\"pre\">FormView</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContactForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FormView</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactFormView</span><span class=\"p\">(</span><span class=\"n\">FormView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;contact.html&quot;</span>\n    <span class=\"n\">form_class</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span>\n    <span class=\"n\">success_url</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;/thanks/&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><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        <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">send_email</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\">form_valid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Nótaí:</p>\n<ul class=\"simple\">\n<li><p>FormView oidhreachtaí: class: ~Django.Views.Generic.Base.TemplateResponseMixin mar sin: attr: ~Django.Views.Generic.Base.TemplateResponseMixin.Template_Name is féidir a úsáid anseo.</p></li>\n<li><p>Níl i bhfeidhm réamhshocraithe le haghaidh: meth: ~django.views.generic.edit.formmixin.form_valid ach a atreorú chuig an:attr: ~django.views.generic.edit.formmixin.success_URL.</p></li>\n</ul>\n</section>\n<section id=\"model-forms\">\n<h2>Foirmeacha múnla<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>Tá tuairimí cineálacha ina ndáiríre ag obair le samhlacha Cruthóidh na tuairimí cineálacha seo a:class: ~django.forms.ModelForm go huathoibríoch, fad is féidir leo a oibriú amach cén rang samhail atá le húsáid:</p>\n<ul class=\"simple\">\n<li><p>Má thugtar tréith: attr: ~Django.Views.Generic.Edit.ModelFormMixin.Model, úsáidfear an rang samhail sin.</p></li>\n<li><p>Má fhilleann Meth: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.views.generic.detail.singleObjectMixin.get_Object () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>réad, úsáidfear aicme an réada sin.</p></li>\n<li><p>Má thugtar a:attr: ~django.views.generic.detail.singleObjectMixin.QuerySet, úsáidfear an tsamhail don tacar ceisteanna sin.</p></li>\n</ul>\n<p>Soláthraíonn tuairimí foirme samhail cur i bhfeidhm a:meth: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.views.generic.edit.ModelFormMixin.Form_Valid () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>a shábhálann an tsamhail go huathoibríoch. Féadfaidh tú é seo a shárú má tá aon riachtanais speisialta agat; féach thíos le haghaidh samplaí.</p>\n<p>Ní gá duit fiú <code class=\"docutils literal notranslate\"><span class=\"pre\">success_url</span></code> a sholáthar do:class: ~django.views.generic.edit.createView nó:class: ~django.views.generic.edit.updateView - úsáidfidh siad: meth: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.db.models.model.get_absolute_url () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>ar an réad samhail má tá sé ar fáil.</p>\n<p>Más mian leat saincheap:class: ~django.forms.modelForm a úsáid (mar shampla chun bailíochtú breise a chur leis), socraí:attr: ~django.views.generic.edit.formmixin.form_class ar do radharc.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Agus rang foirme saincheaptha á shonrú agat, ní mór duit an tsamhail a shonrú fós, cé go bhféadfadh an: attr: ~django.views.generic.edit.formmixin.form_class a bheith a:class: ~django.forms.modelform.</p>\n</aside>\n<p>Ar dtús ní mór dúinn: meth: ~django.db.models.model.get_absolute_url () `a chur leis lenár rang ``Author `:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</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\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </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> <span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;author-detail&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">})</span>\n</code></pre></figure>\n<p>Ansin is féidir linn: class: CreateView agus cairde a úsáid chun an obair iarbhír a dhéanamh. Tabhair faoi deara conas a bhfuilimid díreach ag cumrú na tuairimí cineálacha bunaithe ar rang anseo; ní gá dúinn aon loighic a scríobh muid féin:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse_lazy</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CreateView</span><span class=\"p\">,</span> <span class=\"n\">DeleteView</span><span class=\"p\">,</span> <span class=\"n\">UpdateView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorCreateView</span><span class=\"p\">(</span><span class=\"n\">CreateView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorUpdateView</span><span class=\"p\">(</span><span class=\"n\">UpdateView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorDeleteView</span><span class=\"p\">(</span><span class=\"n\">DeleteView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n    <span class=\"n\">success_url</span> <span class=\"o\">=</span> <span class=\"n\">reverse_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;author-list&quot;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Caithfimid úsáid: func: ~django.urls.reverse_lazy in ionad <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>reverse () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>, toisc nach luchtaítear na urls nuair a allmhairítear an comhad.</p>\n</aside>\n<p>Oibríonn an tréith <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> ar an mbealach céanna leis an tréith <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> ar an rang <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> istigh ar:class: ~django.forms.ModelForm. Mura sainmhíníonn tú an rang foirme ar bhealach eile, tá an tréith ag teastáil agus ardóidh an dearcadh an:exc: ~Django.Core.Exceptions.ImProperlyConfigured eisceacht mura bhfuil sé.</p>\n<p>Má shonraíonn tú na tréithe: attr: ~Django.Views.Generic.Edit.ModelFormMixin.Fields agus:attr: ~Django.Views.Generic.Edit.FormMixin.Form_Class ardófar eisceacht, agó:exc: ~Django.Core.Exceptions.ImProperlyConfigured eisceacht.</p>\n<p>Faoi dheireadh, cuirimid na tuairimí nua seo isteach sa URLConf:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n<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\">AuthorCreateView</span><span class=\"p\">,</span> <span class=\"n\">AuthorDeleteView</span><span class=\"p\">,</span> <span class=\"n\">AuthorUpdateView</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;author/add/&quot;</span><span class=\"p\">,</span> <span class=\"n\">AuthorCreateView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;author-add&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;author/&lt;int:pk&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">AuthorUpdateView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;author-update&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;author/&lt;int:pk&gt;/delete/&quot;</span><span class=\"p\">,</span> <span class=\"n\">AuthorDeleteView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;author-delete&quot;</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\">Note</p>\n<p>Na tuairimí seo oidhre:class: ~django.views.generic.detail.singleObjectTemplateResponseMixin a úsáideas:attr: ~django.views.generic.detail.singleObjectTemplateResponseMixin.Template_Name_Suffix chun an: attr: ~django.views.generic.base.templateResponseMixin.Template_Name_Suffix a thógáil ixin.template_name` bunaithe ar an tsamhail.</p>\n<p>Sa sampla seo:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CreateView</span></code></a> and <a class=\"reference internal\" href=\"/ga/5.2/ref/class-based-views/flattened-index/#UpdateView\" title=\"UpdateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UpdateView</span></code></a> use <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/author_form.html</span></code></p></li>\n<li><p><a class=\"reference internal\" href=\"/ga/5.2/ref/class-based-views/flattened-index/#DeleteView\" title=\"DeleteView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DeleteView</span></code></a> uses <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/author_confirm_delete.html</span></code></p></li>\n</ul>\n<p>Más mian leat teimpléid ar leithligh a bheith agat dó:class: CreateView agus:class: UpdateView, is féidir leat a shocrú fiú:attr: ~django.views.generic.base.templateResponseMixin.Template_Name nó:attr: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.views.generic.detail.singleObjectTemplateResponsemixin.Template_Name_Name_Suaireacht “ar do rang amharc.</p>\n</aside>\n</section>\n<section id=\"models-and-request-user\">\n<h2>Múnlaí agus <code class=\"docutils literal notranslate\"><span class=\"pre\">request.user</span></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>Chun an t-úsáideoir a chruthaigh réad a rianú ag baint úsáide as a:class: CreateView, is féidir leat saincheap:class: ~django.forms.ModelForm a úsáid chun é seo a dhéanamh. Ar dtús, cuir an eochair eachtrach leis an tsamhail leis an tsamhail:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">created_by</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></figure>\n<p>Sa radharc, déan cinnte nach gcuireann tú <code class=\"docutils literal notranslate\"><span class=\"pre\">created_by</span></code> san áireamh sa liosta na réimsí le cur in eagar, agus ride:meth: <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.views.generic.edit.modelformmixin.form_valid () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>chun an t-úsáideoir a chur leis:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.mixins</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LoginRequiredMixin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CreateView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorCreateView</span><span class=\"p\">(</span><span class=\"n\">LoginRequiredMixin</span><span class=\"p\">,</span> <span class=\"n\">CreateView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"p\">):</span>\n        <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">created_by</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">form_valid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p><a class=\"reference internal\" href=\"/ga/5.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> prevents users who\naren't logged in from accessing the form. If you omit that, you'll need to\nhandle unauthorized users in <a class=\"reference internal\" href=\"/ga/5.2/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\"><span class=\"pre\">form_valid()</span></code></a>.</p>\n</section>\n<section id=\"content-negotiation-example\">\n<span id=\"id1\"></span><h2>Sampla idirbheartaíochta ábhair<a class=\"heading-anchor\" href=\"#content-negotiation-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Seo sampla a thaispeánann conas a d'fhéadfá dul i bhfeidhm foirm a oibríonn le sreabhadh oibre atá bunaithe ar API chomh maith le foirm 'gnáth' POSTs:</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\">JsonResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CreateView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">JsonableResponseMixin</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Mixin to add JSON 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\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">form_invalid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">form_invalid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">accepts</span><span class=\"p\">(</span><span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">JsonResponse</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">,</span> <span class=\"n\">status</span><span class=\"o\">=</span><span class=\"mi\">400</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><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        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">form_valid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">accepts</span><span class=\"p\">(</span><span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">,</span>\n            <span class=\"p\">}</span>\n            <span class=\"k\">return</span> <span class=\"n\">JsonResponse</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorCreateView</span><span class=\"p\">(</span><span class=\"n\">JsonableResponseMixin</span><span class=\"p\">,</span> <span class=\"n\">CreateView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>The above example assumes that if the client supports <code class=\"docutils literal notranslate\"><span class=\"pre\">text/html</span></code>, that they\nwould prefer it. However, this may not always be true. When requesting a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">.css</span></code> file, many browsers will send the header\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Accept:</span> <span class=\"pre\">text/css,*/*;q=0.1</span></code>, indicating that they would prefer CSS, but\nanything else is fine. This means <code class=\"docutils literal notranslate\"><span class=\"pre\">request.accepts(&quot;text/html&quot;)</span></code> will be\n<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>To determine the correct format, taking into consideration the client's\npreference, use <a class=\"reference internal\" href=\"/ga/5.2/ref/request-response/#django.http.HttpRequest.get_preferred_type\" title=\"django.http.HttpRequest.get_preferred_type\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.http.HttpRequest.get_preferred_type()</span></code></a>:</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\">JsonableResponseMixin</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Mixin to add JSON 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\n    <span class=\"n\">accepted_media_types</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">]</span>\n\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=\"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=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">get_preferred_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">accepted_media_types</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"c1\"># No format in common.</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span>\n                <span class=\"n\">status_code</span><span class=\"o\">=</span><span class=\"mi\">406</span><span class=\"p\">,</span> <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;Accept&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">accepted_media_types</span><span class=\"p\">)}</span>\n            <span class=\"p\">)</span>\n\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=\"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\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">form_invalid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">form_invalid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n        <span class=\"n\">accepted_type</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">get_preferred_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">accepted_media_types</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">accepted_type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n        <span class=\"k\">elif</span> <span class=\"n\">accepted_type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">JsonResponse</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">,</span> <span class=\"n\">status</span><span class=\"o\">=</span><span class=\"mi\">400</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><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        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">form_valid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n        <span class=\"n\">accepted_type</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">get_preferred_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">accepted_media_types</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">accepted_type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n        <span class=\"k\">elif</span> <span class=\"n\">accepted_type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">:</span>\n            <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">,</span>\n            <span class=\"p\">}</span>\n            <span class=\"k\">return</span> <span class=\"n\">JsonResponse</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"5.2\">\n<p class=\"version-note-title\">Changed in Django 5.2</p><p>The <a class=\"reference internal\" href=\"/ga/5.2/ref/request-response/#django.http.HttpRequest.get_preferred_type\" title=\"django.http.HttpRequest.get_preferred_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">HttpRequest.get_preferred_type()</span></code></a> method was added.</p>\n</aside>\n</section>","rootId":"form-handling-with-class-based-views","toc":[{"title":"Foirmeacha bunús","anchor":"basic-forms","children":[]},{"title":"Foirmeacha múnla","anchor":"model-forms","children":[]},{"title":"Múnlaí agus request.user","anchor":"models-and-request-user","children":[]},{"title":"Sampla idirbheartaíochta ábhair","anchor":"content-negotiation-example","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Using Django","url":"/ga/5.2/topics/"},{"docname":"topics/class-based-views/index","title":"Tuairimí rang-bhunaithe","url":"/ga/5.2/topics/class-based-views/"}],"prev":{"docname":"topics/class-based-views/generic-display","title":"Tuairimí cineálacha bunaithe ar rang ionsuite","url":"/ga/5.2/topics/class-based-views/generic-display/"},"next":{"docname":"topics/class-based-views/mixins","title":"Ag baint úsáide as meascáin le tuairimí rangbhunaithe","url":"/ga/5.2/topics/class-based-views/mixins/"},"formats":{"html":"/ga/5.2/topics/class-based-views/generic-editing/","markdown":"/ga/5.2/topics/class-based-views/generic-editing.md","json":"/ga/5.2/topics/class-based-views/generic-editing.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/class-based-views/generic-editing.txt","official":"https://docs.djangoproject.com/ga/5.2/topics/class-based-views/generic-editing/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}