Найти - Пользователи
Полная версия: Flask и как правильно работать с SelectField
Начало » Web » Flask и как правильно работать с SelectField
1
freeddos
Привет.
Работаю с Flask и WTForm. Имею форму с SelectField заполняю ее через запрос в базу потом формирование list и уже потом передаю на форму в render_template.
 users_from_db = users_db.query.all()
users_list = [(i.id, i.name) for i in users_from_db]
input_form.username.choices = users_list
SelectField заполняется корректно, выбор работает и когда делается submit уже перехватываю данные через request.form.
Но возник вопрос каким образом вернуть те же самые данные в форму с SelectField например если форма не прошла валидацию (чтобы не перезаполнять данные) или в других случаях когда нужно вернуть данные.
Как это сделать? У меня есть идея только такая:
1)получить данные через request.form.
2)получить значение которое вернулось от SelectField
3)сформировать как показал выше заполнение SelectField в форму.
4)из п.2 есть id пользователя, значит по нему могу найти из list значение
 default_for_select=[item for item in users_list if item[0] == id_user]
5) потом значение default_for_select запишу в input_form.username.default
 input_form.username.default = default_for_select[0]
т.к. input_form.username.default принимает значение не индекса и id, т.к. input_form.username.choices принимает list из tuple
Во всем этом есть большое подозрение на велосипед, но возможно как то по лучше сделать?
Спасибо тем кто откликнулся.
py.user.next
freeddos
Но возник вопрос каким образом вернуть те же самые данные в форму с SelectField например если форма не прошла валидацию (чтобы не перезаполнять данные) или в других случаях когда нужно вернуть данные.
Форма заполняется в браузере? Значит, там надо наладить связь через JavaScript. Браузер должен как-то узнать, прошёл ли запрос, и, если не прошёл, заполнить поля формы отправленным ранее содержимым. Это содержимое ты можешь как сохранить в браузере на время выполнения запроса, так и передать его браузеру в качестве ответа “не получилось, ошибка, на тебе данные, которые ты давал”.
freeddos
Правильно ли я понимаю, что лучше использовать JS + JSON.
Flask выдает шаблон главной страницы. На этой странице отрабатывает JS который делает запрос на Flask (на какой нибудь route).
Этот route получает запрос и обрабатывает (например запрос для заполнения того же SelectField), Flask генерирует json из данных которые он взял в базе и отправляет обратно ответ этому JS.
JS получает ответ в виде json и формирует из него заполнение для формы (того же SelectField).

PS получается что jinja не очень удобно т.к. будет перегружаться страница полностью, формироваться объект формы и посылаться в шаблон.
doza_and
freeddos
PS получается что jinja не очень удобно т.к. будет перегружаться
У меня сложилось мнение что у вас перемешались мухи котлеты и бегемоты.

Форма может обрабатываться по меньшей мере 3 принципиально разными способами.

1 Обычная html форма. Сервер формирует в ответ на нажатие кнопки send новую страницу, например при помощи jinja
2. Используется так называемый “Ajax” XMLHttpRequest https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest Сервер получает например json и отдает json Jinja не нужна
3. Используются Вебсокеты. Опять jinja не очень нужна, логика построения сервера совсем другая.

Нужна ли вам jinja только вы и можете решить в зависимости от того как строите систему.
py.user.next
freeddos
PS получается что jinja не очень удобно т.к. будет перегружаться страница полностью, формироваться объект формы и посылаться в шаблон.
При AJAX'е ничего не будет перезагружаться. Ты сможешь редактировать DOM текущей страницы на лету. Скрипт на JavaScript будет в фоне из браузера общаться с бэкендом на сервере через API, который ты сам придумаешь каким угодно. Там Jinja вообще не участвует. Только при первой загрузке страницы Jinja работает. Вся остальная работа по заполнению формы идёт между скриптом в браузере и бэкендом на сервере без участия шаблонов - на голом HTTP-протоколе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB