Mam stronę szablonu oczekującą dwóch formularzy. Jeśli użyję tylko jednego formularza, wszystko będzie w porządku, jak w tym typowym przykładzie:
if request.method == 'POST':
form = AuthorForm(request.POST,)
if form.is_valid():
form.save()
# do something.
else:
form = AuthorForm()
Jeśli jednak chcę pracować z wieloma formularzami, w jaki sposób mogę poinformować widok, że przesyłam tylko jeden formularz, a nie drugi (tj. Nadal jest to request.POST, ale chcę przetworzyć tylko formularz, dla którego przesłano stało się)?
Jest to rozwiązanie oparte na odpowiedzi, w której oczekiwane wyrażenia i zbanowane wyrażenia to nazwy przycisków wysyłania dla różnych formularzy, a oczekiwane wyrażenia i zbanowane wyrażenia to formularze.
if request.method == 'POST':
if 'bannedphrase' in request.POST:
bannedphraseform = BannedPhraseForm(request.POST, prefix='banned')
if bannedphraseform.is_valid():
bannedphraseform.save()
expectedphraseform = ExpectedPhraseForm(prefix='expected')
elif 'expectedphrase' in request.POST:
expectedphraseform = ExpectedPhraseForm(request.POST, prefix='expected')
if expectedphraseform.is_valid():
expectedphraseform.save()
bannedphraseform = BannedPhraseForm(prefix='banned')
else:
bannedphraseform = BannedPhraseForm(prefix='banned')
expectedphraseform = ExpectedPhraseForm(prefix='expected')
Odpowiedzi:
Masz kilka opcji:
Umieść różne adresy URL w akcji dla dwóch formularzy. Następnie będziesz mieć dwie różne funkcje widoku do obsługi dwóch różnych form.
Odczytaj wartości przycisku przesyłania z danych POST. Możesz powiedzieć, który przycisk przesłania został kliknięty: Jak zbudować wiele formularzy django dla przycisków przesyłania?
źródło
Metodą do wykorzystania w przyszłości jest coś takiego. zbanowana fraza jest pierwszą formą, a oczekiwana fraza jest drugą. Jeśli pierwszy zostanie trafiony, drugi zostanie pominięty (co w tym przypadku jest rozsądnym założeniem):
źródło
handled = False
aktualizuje się,True
gdy zostanie znaleziony zgodny formularz?Widoki oparte na klasach Django zapewniają ogólny FormView, ale do wszystkich celów i celów został zaprojektowany do obsługi tylko jednego formularza.
Jednym ze sposobów obsługi wielu formularzy przy użyciu tego samego adresu URL akcji docelowej przy użyciu ogólnych widoków Django jest rozszerzenie „TemplateView”, jak pokazano poniżej; Używam tego podejścia wystarczająco często, aby przekształcić je w szablon IDE Eclipse.
Szablon HTML ma następujący efekt:
źródło
Potrzebowałem wielu formularzy, które są niezależnie sprawdzane na tej samej stronie. Kluczowymi pojęciami, których mi brakowało, były 1) użycie prefiksu formularza dla nazwy przycisku przesyłania i 2) niezwiązany formularz nie uruchamia sprawdzania poprawności. Jeśli to pomaga komukolwiek innemu, oto mój uproszczony przykład dwóch form AForm i BForm przy użyciu TemplateView na podstawie odpowiedzi @ adam-nelson i @ daniel-sokolowski oraz komentarza @zeraien ( https://stackoverflow.com/a/17303480 / 2680349 ):
źródło
data = request.POST if prefix in next(iter(request.POST.keys())) else None
przeciwnym raziein
nie działałby .Chciałem udostępnić moje rozwiązanie, w którym formularze Django nie są używane. Mam wiele elementów formularza na jednej stronie i chcę użyć jednego widoku do zarządzania wszystkimi żądaniami POST ze wszystkich formularzy.
To, co zrobiłem, to wprowadzenie niewidocznego znacznika wejściowego, dzięki czemu mogę przekazać parametr do widoków, aby sprawdzić, który formularz został przesłany.
views.py
źródło
Jest trochę późno, ale to najlepsze rozwiązanie, jakie znalazłem. Tworzysz słownik wyszukiwania dla nazwy formularza i jego klasy, musisz także dodać atrybut, aby zidentyfikować formularz, aw swoich widokach musisz dodać go jako pole ukryte za pomocą
form.formlabel
.Mam nadzieję, że pomoże to w przyszłości.
źródło
Jeśli używasz podejścia z widokami klasowymi i różnymi „działaniami”, mam na myśli
Możesz łatwo obsługiwać błędy z różnych formularzy za pomocą
get_context_data
metody przeciążonej , np .:views.py:
szablon:
źródło
widok:
szablon:
źródło
Oto prosty sposób poradzenia sobie z powyższym.
W szablonie HTML umieszczamy post
Z uwagi
W adresie URL podaj potrzebne informacje, takie jak
źródło