/ / Django request.POST като аргумент на форма - django, django-forms

Django request.POST като аргумент на форма - django, django-forms

Трудно ми е да увивам главата си около това, което request.POST прави като аргумент в следния пример:

def addauthorView(request):
if request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
first_name = form.cleaned_data["firstname"]
last_name = form.cleaned_data["lastname"]
user_email = form.cleaned_data["email"]
c = AuthorModel(firstname=first_name, lastname=last_name, email=user_email)
c.save()
return HttpResponseRedirect("thanks/")
else:
form = ContactForm(request.POST)
return render(request, "addauthor.html", {"form": form})

Така че знам, че това работи, но по някаква причина не мога да разбера магията, с която се случва form = ContactForm(request.POST), Защо ContactForm се нуждае от аргумента request.POST? Какво се случва зад кулисите?

Допълнителен въпрос, защо form = ContactForm(request.POST) след това се повтаря в else: блок. Защо това е полезно и кога е полезно? Примери?

Отговори:

3 за отговор № 1

Накратко, request.POST е просто данните, които са били изпратени при подаване на формуляра. Това е речник на потребителя, за който е подаден firstname, lastname и email във вашия примерен код. За тези, които идват от PHP фон, това е това, което е предоставено в $_POST.

form = ContactForm(request.POST) свързва данните с класа на формите, така че Django може да прави забавни неща като потвърждаване на входовете is_valid().

Защо тогава бихте добавили request.POST към else: блокира? Били ли сте някога изпратили формуляр на уебсайт и когато възникна грешка, трябваше да попълните формуляра отново? Това е тромаво потребителско изживяване, нали? Изпращайки формуляра обратно на потребителя с данните от request.POST, можете да пренасочите това, което потребителят е въвел - заедно с полезни екстри като съобщения за грешки - така че да могат да ги коригират и изпратят отново.

EDIT: За да се разшири, тук е в него метод от класа BaseForm в Django:

def __init__(self, data=None, files=None, auto_id="id_%s", prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
empty_permitted=False):
self.is_bound = data is not None or files is not None
self.data = data or {}
self.files = files or {}
self.auto_id = auto_id
self.prefix = prefix
self.initial = initial or {}
self.error_class = error_class
# Translators: This is the default suffix added to form field labels
self.label_suffix = label_suffix if label_suffix is not None else _(":")
self.empty_permitted = empty_permitted
self._errors = None  # Stores the errors after clean() has been called.
self._changed_data = None

# The base_fields class attribute is the *class-wide* definition of
# fields. Because a particular *instance* of the class might want to
# alter self.fields, we create self.fields here by copying base_fields.
# Instances should always modify self.fields; they should not modify
# self.base_fields.
self.fields = copy.deepcopy(self.base_fields)

Когато минеш request.POST за вашия клас клас, вие наистина правите data=request.POST, Това от своя страна задейства self.is_bound = True