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.
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_values
incluir 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.
deixe-me dizer algumas palavras