У меня есть страница шаблона, ожидающая две формы. Если я просто использую одну форму, все в порядке, как в этом типичном примере:
if request.method == 'POST':
form = AuthorForm(request.POST,)
if form.is_valid():
form.save()
# do something.
else:
form = AuthorForm()
Однако, если я хочу работать с несколькими формами, как я могу сообщить представлению, что я отправляю только одну из форм, а не другую (т.е. это все еще request.POST, но я хочу только обработать форму, для которой отправляю получилось)?
Это решение основано на ответе, где ожидаемая фраза и запрещенная фраза являются названиями кнопок отправки для различных форм, а ожидаемая фраза и запрещенная фраза являются формами.
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')
Ответы:
У вас есть несколько вариантов:
Поместите разные URL-адреса в действие для двух форм. Тогда у вас будет две разные функции просмотра для работы с двумя разными формами.
Прочитайте значения кнопки отправки из данных POST. Вы можете сказать, какая кнопка отправки была нажата: Как я могу построить несколько кнопок отправки формы django?
источник
Метод для дальнейшего использования - что-то вроде этого. bannedphraseform - это первая форма, а ожидаемая фраза - вторая. Если первый попадет, второй будет пропущен (что в данном случае является разумным предположением):
источник
handled = False
обновление, которое обновляетсяTrue
при обнаружении совместимой формы?Представления на основе классов в Django предоставляют общий FormView, но для всех целей и задач он предназначен для обработки только одной формы.
Один из способов обработки нескольких форм с одним и тем же целевым URL-адресом действия с использованием общих представлений Django состоит в расширении TemplateView, как показано ниже; Я использую этот подход достаточно часто, чтобы превратить его в шаблон Eclipse IDE.
HTML-шаблон имеет следующий эффект:
источник
Мне нужно было несколько форм, которые независимо проверялись на одной странице. Ключевые понятия, которые я пропустил: 1) использование префикса формы для имени кнопки отправки и 2) неограниченная форма не запускает проверку. Если это кому-то поможет, вот мой упрощенный пример двух форм AForm и BForm, использующих TemplateView на основе ответов @ adam-nelson и @ daniel-sokolowski и комментария @zeraien ( https://stackoverflow.com/a/17303480 / 2680349 ):
источник
data = request.POST if prefix in next(iter(request.POST.keys())) else None
противном случаеin
не сработало.Хотел поделиться своим решением, где формы Django не используются. У меня есть несколько элементов формы на одной странице, и я хочу использовать одно представление для управления всеми запросами POST из всех форм.
Я ввел невидимый тег ввода, чтобы я мог передать в представления параметр, чтобы проверить, какая форма была отправлена.
views.py
источник
Это немного поздно, но это лучшее решение, которое я нашел. Вы создаете поисковый словарь для имени формы и ее класса, вы также должны добавить атрибут для идентификации формы, а в ваших представлениях вы должны добавить его как скрытое поле с помощью
form.formlabel
.Я надеюсь, что это поможет в будущем.
источник
Если вы используете подход с представлениями, основанными на классе, и с разными атрибутами действий, я имею в виду
Вы можете легко обрабатывать ошибки из разных форм, используя перегруженный
get_context_data
метод, например:views.py:
шаблон:
источник
Посмотреть:
шаблон:
источник
Вот простой способ справиться с вышеизложенным.
В HTML-шаблон мы помещаем сообщение
Ввиду
В URL дать необходимую информацию, как
источник