Passar um valor de caixa de seleção de um formulário Flask-WTForms em um redirecionamento de volta para o mesmo formulário

Erik Oosterwaal

Usando Flask e Flask-WTF, desejo redirecionar para uma página com um formulário que tem uma caixa de seleção. Eu tenho uma página de busca inicial que tem um formulário chamado "SearchForm", e depois que um usuário faz uma busca, eu o redireciono para uma página de resultados que tem o mesmo SearchForm nela, seguido por uma lista de resultados. Isso permite que o usuário pesquise novamente na página de resultados.

Este é o meu formulário:

class SearchForm(Form):
    """Search form class"""
    from app.utils.translation import Translation

    criteria = StringField(Translation.label('search'), validators=[DataRequired()])
    all_employees = BooleanField(Translation.label('all_employees'), validators=[])

Agora, quando os usuários enviam o formulário, posso instanciá-lo assim:

form = SearchForm(request.form)

E posso obter os dados usando (por exemplo):

form.data['all_employees']

Se eu não marcar a caixa de seleção, WTForms analisará corretamente all_employees como False . Eu redireciono para a página de resultados que tem o mesmo formulário e gostaria de renderizar esse formulário com os dados que o usuário acabou de enviar. Então eu faço isso:

return redirect(url_for('employees.search',
                        criteria=form.data["criteria"],
                        all_employees=form.data["all_employees"]
                        ))

No formulário de pesquisa, instancio o formulário novamente, com as variáveis ​​de querystring (URL):

form = SearchForm(request.args)

Agora, o problema é que, como form.data ['all_employees'] tem um valor "False", a caixa de seleção está marcada. É claro que este é um comportamento normal para HTML, um valor de caixa de seleção só é passado se a caixa estiver marcada. Portanto, se houver um valor (e "False" é um valor), a caixa de seleção é marcada.

Eu poderia contornar isso usando algo assim no meu redirecionamento:

all_employees='y' if form.data['all_employees'] else ''

Mas isso significa que eu teria que fazer isso constantemente para cada campo de caixa de seleção em cada redirecionamento. Tenho muitas telas semelhantes que gostaria de implementar dessa forma.

Posso imaginar que WTforms também poderia, de alguma forma, analisar valores "falsos" para uma caixa de seleção, e não marcar a caixa nesses casos, mas não consigo encontrar nenhuma documentação se isso for possível.

Também considerei manipulá-lo na página de resultados e remover uma variável da coleção request.args se o valor for "falso", mas isso também parece confuso.

Talvez haja outra maneira de fazer isso, da qual não estou ciente, ou talvez minha solução alternativa seja apenas uma maneira de lidar com redirecionamentos com uma caixa de seleção, não sei, mas me parece que esse é um uso bastante comum -caso para o qual Flask-WTForms provavelmente teria algum tipo de solução.

Qualquer conselho seria apreciado.

EDITAR :

O problema é ainda maior; Acabei de perceber que passar uma string vazia para o meu redirecionamento, usando este código:

all_employees='y' if form.data['all_employees'] else ''

E, posteriormente, instanciar e renderizar o formulário usando:

form = SearchForm(request.args)

Irá renderizar as caixas de seleção vazias como:

<input id="include_inactive" name="include_inactive" type="checkbox" value="">

Portanto, checando-o novamente depois, passará uma string vazia de volta para o Flask, então quando uma caixa de seleção é desmarcada uma vez, ela terá um valor vazio renderizado depois disso, e nunca poderá ser marcada novamente.

Crast

Basicamente, a string urlencoded otherdata=value&all_employees=Falseé um valor verdadeiro da perspectiva das caixas de seleção HTML.

WTForms geralmente segue as regras de formulários HTML e dados de formulário. No entanto, como esse valor booleano é uma implicância comum, você pode personalizá-lo usando o parâmetro de palavra-chave false_values para definir os valores 'falsey' ... você pode false_valuesincluir a string False.

A maneira alternativa de ser mais "amigável às especificações HTML" seria um auxiliar parecido com este:

def url_for_form(urlname, form, **kwargs):
    for field in form:
        if field.data:  # would exclude blank strings too
            kwargs[field.name] = field.data

    return url_for(urlname, **kwargs)

o uso seria como url_for_form('blah.search', form, otherparam=9)

Se você precisar selecionar campos específicos, poderá projetá-lo de maneira um pouco diferente.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

  1. 1

    Obtendo apenas o número de uma String C #

  2. 2

    como acessar a conexão do banco de dados em visualizações no codeigniter 4

  3. 3

    Como redimensionar tabelas geradas pelo Stargazer no R Markdown?

  4. 4

    recuperar valores em uma linha de dataframes com base no valor em outro

  5. 5

    Firebase Storage Web: como fazer upload de um arquivo

  6. 6

    为什么在使用argc和argv时不会出现分段错误?

  7. 7

    Como agrupar objetos em uma lista em outras listas por atributo usando streams e Java 8?

  8. 8

    Qual é a diferença entre o tamanho do passo e a taxa de aprendizado no aprendizado de máquina?

  9. 9

    Por que definir a variável como uma string vazia não é necessária em meu código?

  10. 10

    Insert a value to hidden input Laravel Blade

  11. 11

    Configure o coletor de arquivos Serilog para usar um arquivo de log por execução do aplicativo

  12. 12

    Como ler arquivos yaml em laravel?

  13. 13

    Série Fibonacci usando programação dinâmica

  14. 14

    Como adicionar elementos a um array multidimensional em PHP?

  15. 15

    How do I set an IronPython ctypes c_char_p pointer to an absolute address that is not a valid memory address to read from?

  16. 16

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  17. 17

    Como faço para que um formulário no Access se torne uma janela pop-up?

  18. 18

    Como anexar um arquivo a um e-mail usando JavaMail

  19. 19

    Adicionar campos de texto dinâmicos por meio da seleção suspensa de componentes?

  20. 20

    如何使用SOM算法进行分类预测

  21. 21

    TypeError não capturado: não é possível atribuir a propriedade somente leitura

quentelabel

Arquivo