Я потратил пару дней, пытаясь заставить WTForms проверить мои request.args
, но я просто не могу заставить form.validate()
вернуть True
.
Идея в том, что у меня есть простой текстовое поле для пользовательского ввода в WTForm, как показано ниже.
form.py
class SearchForm(FlaskForm):
q = StringField('q',
validators=[])
search = SubmitField('Search')
def validate_q(self, q):
if q.data not in allowed_values: #"allowed_values" is just a list I want to check against
raise ValidationError('')
поиск. html
<form method="GET" action="{{ url_for('finance.search') }}">
<div class="col-9 col-md-5 p-0 m-0">
{% if form.q.errors %} {{ form.q(class="form-control form-control-md is-invalid") }}
<div class="invalid-feedback">
{% for error in form.q.errors %}
<span>{{ error }}</span> {% endfor %}
</div>
{% else %} {{ form.q(class="form-control form-control-md") }} {% endif %}
</div>
<div class="col-2 col-md-2 p-0">
{{ form.search(class="btn btn-md btn-dark") }}
</div>
</form>
rout.py
@finance.route('/finance/search')
def search():
form = SearchForm(request.args)
print(form.validate()) #always gives false
Код HTML для формы включен в несколько шаблонов, и отправка формы всегда указывает на отображаемый маршрут поиска. ниже. Я попытался следовать документации WTForms и передал request.args
в форму. Когда я запускал .validate()
на объекте, также выполнялась функция проверки для параметра q
, но по какой-то причине .validate()
всегда возвращает False
.
Может кто-нибудь уточнить, почему это может быть? Я знаю, что могу использовать пост-запрос или добавить собственную функцию проверки внутри маршрута, но я хочу избегать обходных путей, если это возможно.
(переполнение стека, похоже, использует подобный тип архитектуры для поиска http://127.0.0.1:8000/finance/search?q=aapl&search=Search
против https://stackoverflow.com/search?q=aapl
и я хочу следовать этому, если это возможно.)
Спасибо!