Форум сайта python.su
Доброго времени суток
Создаю страницу, на которой в виде таблицы выводятся значения базы данных (прикрепил скрин). Первые два столбца таблицы - из экземпляров полей формы. Я хочу чтобы поставив галочку в нужных чекбоксах, получить данные из соответствующих стрингфилдов, с которыми уже будет происходить do_something().
Пытался разобраться самостоятельно, увы, не выходит
routes.py:
@app.route('/check', methods=['GET', 'POST']) def check(): form = CheckForm() id_list = [str(val) for val, in db.session.query(Docs.id).all()] name_list = [val for val, in db.session.query(Docs.name).all()] date_of_creation_list = [val.strftime('%d-%m-%Y') for val, in db.session.query(Docs.date_of_creation)] count = db.session.query(Docs).count() if files_count_discrepancy() == True or file_names_discrepancy() == True: message = """ Data Security at Risk. Information about the number of files is not reliable. Or the names do not matched """ flash(message) return render_template('check.html', form = form, id_list = id_list, name_list = name_list, date_of_creation_list = date_of_creation_list, count = count)
... <form action="" method="POST"> <div class="table-wrapper"> <input class="form-control" id="Input" type="text" placeholder="Search"> <br> <table class="table table-bordered table-dark"> <thead> <tr> <th scope="col">#</th> <th scope="col">FIle</th> <th scope="col">Name</th> <th scope="col">Date of creation</th> </tr> </thead> <tbody id="DocsTable"> {% for i in range(0, count) %} <tr> <td> <label class="custom-control-input">{{ loop.index }}</label> {{ form.checkbox }} </td> <td>{{ form.file_name(value=id_list[i]) }}</td> <td>{{ name_list[i] }}</td> <td>{{ date_of_creation_list[i] }}</td> </tr> {% endfor %} </tbody> </table> </div> </form> ...
class CheckForm(FlaskForm): checkbox = BooleanField() file_name = StringField(validators=[DataRequired()])
Прикреплённый файлы:
Снимок экрана от 2019-08-23 15-51-00.png (213,5 KБ)
Офлайн
Ethex
EthexИМХО, неправильно. Никто так уже не пишет веб-сайты в 2019-м году. Чем скорее вы поймете, что данные надо передавать JSON-ом через AJAX, тем меньше у вас будет геморроя.
в правильную ли сторону я думать начинал
Офлайн
FishHookСтало быть мои действия:
Чем скорее вы поймете, что данные надо передавать JSON-ом через AJAX, тем меньше у вас будет геморроя.
Офлайн
Ethex
Смотрите, сейчас вы работаете так: сервер получает запрос от пользователя, формирует страницу с данными и формами, отправляет её клиенту, пользователь работает с формой, по нажатию submit форма сериализуется в запрос, запрос уходит на сервер, сервер валидирует форму, из в зависимости от результата валидации формирует новую страницу и отправляет её клиенту.
То есть клиент-сервеное взаимодействие происходит путем обмена: ГЕТ или ПОСТ запрос -> HTML страница.
Это не есть хорошо и правильно. Если ваш клиент не переходит на другой адрес, нет необходимости менять текущую отображающуюся страницу на другую. Можно работать так:
сервер получает запрос от пользователя, формирует страницу, отправляет её клиенту, клиент запрашивает данные и заполняет ими страницу, пользователь работает с формой, по нажатию submit форма валидируется на клиенте и в случае успешной валидации формирует запрос с данными формы, запрос уходит на сервер, сервер валидирует запрос, из в зависимости от результата валидации формирует ответ клиенту об успехе или неуспехе.
То есть клиент-сервеное взаимодействие происходит в основном путем обмена: данные -> данные. Не нужен постоянный рендеринг страницы.
Офлайн
FishHookКак раз такую страницу я и пытаюсь сделать, которая не отправляла бы данные формы на следующую и т.п.
Не нужен постоянный рендеринг страницы.
Офлайн
Ethex
спрашиваю у гугла о том, что такое ajax
EthexТы можешь вообще сделать div с полями input и кнопку button. Дальше назначаешь им классы с их именами. Потом используешь JavaScript и DOM. На нажатие кнопки добавляешь event listener. Обработчик нажатия кнопки отыскивает все поля в DOM по их именам через document.querySelector() и собирает их значения в один объект JavaScript. Затем этот объект превращается в JSON-данные через JSON.stringify(). И вот таким образом ты получаешь данные для отправки. Дальше их нужно отправить асинхронно на сервер, а на ответ от сервера прикрепить обработчик ответа. Поизучай XMLHttpRequest. Через него можно отправить на сервер и ответ сервера тоже через него берётся. У этого объекта есть событие “отправил”, на которое ты точно так же добавляешь event listener ещё до отправки запроса на сервер. Когда сервер принял запрос и ответил, на этом XMLHttpRequest-объекте возникает событие “отправил”, а на нём уже срабатывает обработчик события, который должен взять ответ сервера, отыскать в DOM нужный элемент через document.querySelector() и в него вывести результат ответа сервера в виде текста. Естественно, на каждом этапе ты можешь внедряться в данные и конвертировать их из кодов в тексты и из текстов в коды.
Но пока представления о том, как этого достичь менее чем туманны.
Отредактировано py.user.next (Авг. 30, 2019 04:04:47)
Офлайн
EthexПрежде всего вам нужно погрузиться в волшебный мир JavaScript, это в любом случае необходимо, без JS современный веб немыслим.
FishHook, подскажете что мне для этого нужно?
Офлайн