Eu tenho uma página de modelo esperando dois formulários. Se eu apenas usar um formulário, tudo ficará bem como neste exemplo típico:
if request.method == 'POST':
form = AuthorForm(request.POST,)
if form.is_valid():
form.save()
# do something.
else:
form = AuthorForm()
No entanto, se eu quiser trabalhar com vários formulários, como faço para que a visualização saiba que estou enviando apenas um e não o outro (ou seja, ainda é request.POST, mas quero apenas processar o formulário para o qual o envio foi enviado) aconteceu)?
Esta é a solução baseada na resposta em que a frase esperada e a frase banida são os nomes dos botões de envio para os diferentes formulários, e a forma esperada e o formulário bannedphrase são os formulários.
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')
Respostas:
Você tem poucas opções:
Coloque URLs diferentes na ação para os dois formulários. Então você terá duas funções de visualização diferentes para lidar com as duas formas diferentes.
Leia os valores do botão enviar dos dados do POST. Você pode dizer qual botão de envio foi clicado: Como criar vários botões de envio no formulário django?
fonte
Um método para referência futura é algo assim. bannedphraseform é o primeiro formulário e o esperadophraseform é o segundo. Se o primeiro for atingido, o segundo será ignorado (que é uma suposição razoável neste caso):
fonte
handled = False
que seja atualizado paraTrue
quando um formulário compatível for encontrado?As visões baseadas em classe do Django fornecem um FormView genérico, mas para todos os efeitos, ele foi projetado para lidar apenas com um formulário.
Uma maneira de lidar com múltiplos formulários com o mesmo URL de ação de destino usando as visualizações genéricas do Django é estender o 'TemplateView' como mostrado abaixo; Eu uso essa abordagem com bastante frequência para transformá-la em um modelo IDE do Eclipse.
O modelo html tem o seguinte efeito:
fonte
Eu precisava de vários formulários validados independentemente na mesma página. Os principais conceitos que estavam faltando eram 1) usar o prefixo do formulário para o nome do botão enviar e 2) um formulário ilimitado não aciona a validação. Se ajudar alguém, aqui está o meu exemplo simplificado de dois formulários AForm e BForm usando TemplateView com base nas respostas de @ adam-nelson e @ daniel-sokolowski e comentário de @zeraien ( https://stackoverflow.com/a/17303480 / 2680349 ):
fonte
data = request.POST if prefix in next(iter(request.POST.keys())) else None
caso contrárioin
, não funcionaria.Queria compartilhar minha solução onde o Django Forms não está sendo usado. Eu tenho vários elementos de formulário em uma única página e quero usar uma única exibição para gerenciar todas as solicitações POST de todos os formulários.
O que fiz foi introduzir uma tag de entrada invisível para que eu possa passar um parâmetro para as visualizações para verificar qual formulário foi enviado.
views.py
fonte
É um pouco tarde, mas esta é a melhor solução que encontrei. Você cria um dicionário de pesquisa para o nome do formulário e sua classe, também precisa adicionar um atributo para identificar o formulário e, nas visualizações, deve adicioná-lo como um campo oculto, com o
form.formlabel
.Espero que isso ajude no futuro.
fonte
Se você estiver usando uma abordagem com visualizações baseadas em classe e atributos diferentes de "ação", quero dizer
Você pode lidar facilmente com erros de diferentes formas usando sobrecarregado
get_context_data
método , por exemplo:views.py:
modelo:
fonte
Visão:
modelo:
fonte
Aqui está uma maneira simples de lidar com o exposto acima.
No Template Html, colocamos Post
Em vista
In URL Forneça as informações necessárias, como
fonte