Injetar erros em um formulário já validado?

97

Depois de form.Formvalidar os valores de entrada do usuário, passo-os para um processo separado (externo) para processamento posterior. Esse processo externo pode potencialmente encontrar mais erros nos valores.

Existe uma maneira de injetar esses erros no formulário já validado para que possam ser exibidos por meio dos métodos usuais de exibição de erros de formulário (ou há melhores abordagens alternativas)?

Uma sugestão foi incluir o processamento externo na validação do formulário, o que não é o ideal porque o processo externo faz muito mais do que apenas validar.

Parand
fonte

Respostas:

92

Form._errorspode ser tratado como um dicionário padrão. É considerado uma boa forma de usar a ErrorListclasse e acrescentar erros à lista existente:

from django.forms.utils import ErrorList
errors = form._errors.setdefault("myfield", ErrorList())
errors.append(u"My error here")

E se você quiser adicionar erros que não sejam de campo, use django.forms.forms.NON_FIELD_ERRORS(o padrão é "__all__") em vez de "myfield".

John Millikin
fonte
2
Isso parece um pouco desagradável, já que o nome "_errors" sugere que ele seja interno à classe do formulário. Essa é a maneira padrão de fazer isso no Django? Estou em uma situação semelhante ao OP: tenho um formulário onde os usuários fornecem um novo nome que deve ser exclusivo no banco de dados. Se houver uma colisão, gostaria de enviar o formulário de volta com um erro, mas não saberei até tentar fazer a inserção do banco de dados. (Em teoria, o validador poderia verificar o banco de dados, mas isso tem cheiro e é propenso a corrida.)
Weeble
1
@scompt: obrigado, corrigido. @Weeble: _errorsfaz parte da API pública, apesar do nome; veja a resposta do insin para um link de docs.
John Millikin
18
Isso é incrivelmente não pitônico. Quão difícil foi implementar form.errors ['my_error']. Append (my_error) ou form.add_error ('myfield', my_error)? Muito espaço para erros (sem trocadilhos) na implementação atual.
Michael
2
Quase completo. Uma observação extra é que se is_valid () não foi chamado, você precisará definir form._errors = ErrorDict ()
jacob
12
@Michael - parece que eles seguiram seu conselho ... Django Dev - Form.add_error (campo, erro)
Clayton
14

Você pode adicionar detalhes de erro adicionais ao _errorsatributo do formulário diretamente:

https://docs.djangoproject.com/en/1.5/ref/forms/validation/#described-later https://docs.djangoproject.com/en/1.6/ref/forms/validation/#modifying-field-errors

Jonny Buchanan
fonte
6
E, aparentemente, na versão de desenvolvimento pós 1.6, eles estão adicionando uma add_errorfunção: docs.djangoproject.com/en/dev/ref/forms/api/…
brianmearns
E agora o Django 1.7 tem uma função add_error oficial: docs.djangoproject.com/en/1.7/ref/forms/api/…
Danilo Cabello
0

Adicione o erro ao campo específico:

form.add_error('fieldName', 'error description')

** Adicionar erro a campos não **

form.add_error(None, 'error description')
#Only pass None instead of field name
Muhammad Faizan Fareed
fonte