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.pyfrom 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.pyfrom 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
Generic views really shine when working with models. These generic
views will automatically create a ModelForm, so long as
they can work out which model class to use:
Má thugtar tréith: attr: ~Django.Views.Generic.Edit.ModelFormMixin.Model, úsáidfear an rang samhail sin.
If
get_object()returns an object, the class of that object will be used.Má thugtar a:attr: ~django.views.generic.detail.singleObjectMixin.QuerySet, úsáidfear an tsamhail don tacar ceisteanna sin.
Model form views provide a
form_valid() implementation
that saves the model automatically. You can override this if you have any
special requirements; see below for examples.
You don't even need to provide a success_url for
CreateView or
UpdateView - they will use
get_absolute_url() on the model object if
available.
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.
First we need to add get_absolute_url() to our
Author class:
models.pyfrom 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.pyfrom 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.pyfrom 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.pyfrom 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)
# ...
In the view, ensure that you don't include created_by in the list of fields
to edit, and override
form_valid() to add the user:
views.pyfrom 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:
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():
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)