Láimhseáil foirme le tuairimí rangbhunaitheLink to this heading

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 le sonraí bailí (próiseáil na sonraí agus athreorú de ghnáth)

<using-a-form-in-a-view>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: `Foirm a úsáid i radharc `). 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.

Foirmeacha bunúsLink to this heading

Mar gheall ar fhoirm teagmhála:

foirme.py
Python
from django import forms


class ContactForm(forms.Form):
    name = forms.CharField()
    message = forms.CharField(widget=forms.Textarea)

    def send_email(self):
        # send email using the self.cleaned_data dictionary
        pass

Is féidir an radharc a thógáil ag baint úsáide as FormView:

views.py
Python
from myapp.forms import ContactForm
from django.views.generic.edit import FormView


class ContactFormView(FormView):
    template_name = "contact.html"
    form_class = ContactForm
    success_url = "/thanks/"

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        form.send_email()
        return super().form_valid(form)

Nótaí:

  • 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.

  • 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.

Foirmeacha múnlaLink to this heading

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:

  • Má thugtar tréith: attr: ~Django.Views.Generic.Edit.ModelFormMixin.Model, úsáidfear an rang samhail sin.

  • Má fhilleann Meth: `~django.views.generic.detail.singleObjectMixin.get_Object () `réad, úsáidfear aicme an réada sin.

  • Má thugtar a:attr: ~django.views.generic.detail.singleObjectMixin.QuerySet, úsáidfear an tsamhail don tacar ceisteanna sin.

Soláthraíonn tuairimí foirme samhail cur i bhfeidhm a:meth: `~django.views.generic.edit.ModelFormMixin.Form_Valid () `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í.

Ní gá duit fiú success_url a sholáthar do:class: ~django.views.generic.edit.createView nó:class: ~django.views.generic.edit.updateView - úsáidfidh siad: meth: `~django.db.models.model.get_absolute_url () `ar an réad samhail má tá sé ar fáil.

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.

Ar dtús ní mór dúinn: meth: ~django.db.models.model.get_absolute_url () `a chur leis lenár rang ``Author `:

models.py
Python
from django.db import models
from django.urls import reverse


class Author(models.Model):
    name = models.CharField(max_length=200)

    def get_absolute_url(self):
        return reverse("author-detail", kwargs={"pk": self.pk})

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:

views.py
Python
from django.urls import reverse_lazy
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from myapp.models import Author


class AuthorCreateView(CreateView):
    model = Author
    fields = ["name"]


class AuthorUpdateView(UpdateView):
    model = Author
    fields = ["name"]


class AuthorDeleteView(DeleteView):
    model = Author
    success_url = reverse_lazy("author-list")

Oibríonn an tréith fields ar an mbealach céanna leis an tréith fields ar an rang Meta 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é.

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.

Faoi dheireadh, cuirimid na tuairimí nua seo isteach sa URLConf:

urls.py
Python
from django.urls import path
from myapp.views import AuthorCreateView, AuthorDeleteView, AuthorUpdateView

urlpatterns = [
    # ...
    path("author/add/", AuthorCreateView.as_view(), name="author-add"),
    path("author/<int:pk>/", AuthorUpdateView.as_view(), name="author-update"),
    path("author/<int:pk>/delete/", AuthorDeleteView.as_view(), name="author-delete"),
]

Múnlaí agus request.userLink to this heading

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:

models.py
Python
from django.contrib.auth.models import User
from django.db import models


class Author(models.Model):
    name = models.CharField(max_length=200)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)

    # ...

Sa radharc, déan cinnte nach gcuireann tú created_by san áireamh sa liosta na réimsí le cur in eagar, agus ride:meth: `~django.views.generic.edit.modelformmixin.form_valid () `chun an t-úsáideoir a chur leis:

views.py
Python
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView
from myapp.models import Author


class AuthorCreateView(LoginRequiredMixin, CreateView):
    model = Author
    fields = ["name"]

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super().form_valid(form)

LoginRequiredMixin prevents users who aren't logged in from accessing the form. If you omit that, you'll need to handle unauthorized users in form_valid().

Sampla idirbheartaíochta ábhairLink to this heading

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:

Code
from django.http import JsonResponse
from django.views.generic.edit import CreateView
from myapp.models import Author


class JsonableResponseMixin:
    """
    Mixin to add JSON support to a form.
    Must be used with an object-based FormView (e.g. CreateView)
    """

    def form_invalid(self, form):
        response = super().form_invalid(form)
        if self.request.accepts("text/html"):
            return response
        else:
            return JsonResponse(form.errors, status=400)

    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        response = super().form_valid(form)
        if self.request.accepts("text/html"):
            return response
        else:
            data = {
                "pk": self.object.pk,
            }
            return JsonResponse(data)


class AuthorCreateView(JsonableResponseMixin, CreateView):
    model = Author
    fields = ["name"]

The above example assumes that if the client supports text/html, that they would prefer it. However, this may not always be true. When requesting a .css file, many browsers will send the header Accept: text/css,*/*;q=0.1, indicating that they would prefer CSS, but anything else is fine. This means request.accepts("text/html") will be True.

To determine the correct format, taking into consideration the client's preference, use django.http.HttpRequest.get_preferred_type():

Code
class JsonableResponseMixin:
    """
    Mixin to add JSON support to a form.
    Must be used with an object-based FormView (e.g. CreateView).
    """

    accepted_media_types = ["text/html", "application/json"]

    def dispatch(self, request, *args, **kwargs):
        if request.get_preferred_type(self.accepted_media_types) is None:
            # No format in common.
            return HttpResponse(
                status_code=406, headers={"Accept": ",".join(self.accepted_media_types)}
            )

        return super().dispatch(request, *args, **kwargs)

    def form_invalid(self, form):
        response = super().form_invalid(form)
        accepted_type = self.request.get_preferred_type(self.accepted_media_types)
        if accepted_type == "text/html":
            return response
        elif accepted_type == "application/json":
            return JsonResponse(form.errors, status=400)

    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        response = super().form_valid(form)
        accepted_type = self.request.get_preferred_type(self.accepted_media_types)
        if accepted_type == "text/html":
            return response
        elif accepted_type == "application/json":
            data = {
                "pk": self.object.pk,
            }
            return JsonResponse(data)