Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2019 13:48:52

Ethex
Зарегистрирован: 2017-10-19
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Получение данных таблицы

Доброго времени суток
Создаю страницу, на которой в виде таблицы выводятся значения базы данных (прикрепил скрин). Первые два столбца таблицы - из экземпляров полей формы. Я хочу чтобы поставив галочку в нужных чекбоксах, получить данные из соответствующих стрингфилдов, с которыми уже будет происходить 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)

код формы html:
 ...
<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>
...

forms.py:
 class CheckForm(FlaskForm):
    checkbox = BooleanField()
    file_name = StringField(validators=[DataRequired()])

Подскажите в какую сторону дальше думать и в правильную ли сторону я думать начинал
Заранее спасибо

Прикреплённый файлы:
attachment Снимок экрана от 2019-08-23 15-51-00.png (213,5 KБ)

Офлайн

#2 Авг. 29, 2019 15:52:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Получение данных таблицы

Ethex

Ethex
в правильную ли сторону я думать начинал
ИМХО, неправильно. Никто так уже не пишет веб-сайты в 2019-м году. Чем скорее вы поймете, что данные надо передавать JSON-ом через AJAX, тем меньше у вас будет геморроя.



Офлайн

#3 Авг. 29, 2019 16:34:05

Ethex
Зарегистрирован: 2017-10-19
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Получение данных таблицы

FishHook
Чем скорее вы поймете, что данные надо передавать JSON-ом через AJAX, тем меньше у вас будет геморроя.
Стало быть мои действия:
- отказываюсь от класса wtf и вывожу данные таблицей без формы;
- спрашиваю у гугла о том, что такое ajax, как его готовить, и как передать с его помощью данные из таблицы в представление Flask
?

Офлайн

#4 Авг. 29, 2019 17:34:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Получение данных таблицы

Ethex
Смотрите, сейчас вы работаете так: сервер получает запрос от пользователя, формирует страницу с данными и формами, отправляет её клиенту, пользователь работает с формой, по нажатию submit форма сериализуется в запрос, запрос уходит на сервер, сервер валидирует форму, из в зависимости от результата валидации формирует новую страницу и отправляет её клиенту.
То есть клиент-сервеное взаимодействие происходит путем обмена: ГЕТ или ПОСТ запрос -> HTML страница.

Это не есть хорошо и правильно. Если ваш клиент не переходит на другой адрес, нет необходимости менять текущую отображающуюся страницу на другую. Можно работать так:

сервер получает запрос от пользователя, формирует страницу, отправляет её клиенту, клиент запрашивает данные и заполняет ими страницу, пользователь работает с формой, по нажатию submit форма валидируется на клиенте и в случае успешной валидации формирует запрос с данными формы, запрос уходит на сервер, сервер валидирует запрос, из в зависимости от результата валидации формирует ответ клиенту об успехе или неуспехе.
То есть клиент-сервеное взаимодействие происходит в основном путем обмена: данные -> данные. Не нужен постоянный рендеринг страницы.



Офлайн

#5 Авг. 29, 2019 21:01:51

Ethex
Зарегистрирован: 2017-10-19
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Получение данных таблицы

FishHook
Не нужен постоянный рендеринг страницы.
Как раз такую страницу я и пытаюсь сделать, которая не отправляла бы данные формы на следующую и т.п.
Но пока представления о том, как этого достичь менее чем туманны. До сих пор только со страницы на страницу данные и переносил
FishHook, подскажете что мне для этого нужно?

Офлайн

#6 Авг. 30, 2019 03:54:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9818
Репутация: +  852  -
Профиль   Отправить e-mail  

Получение данных таблицы

Ethex
спрашиваю у гугла о том, что такое ajax
Ethex
Но пока представления о том, как этого достичь менее чем туманны.
Ты можешь вообще сделать div с полями input и кнопку button. Дальше назначаешь им классы с их именами. Потом используешь JavaScript и DOM. На нажатие кнопки добавляешь event listener. Обработчик нажатия кнопки отыскивает все поля в DOM по их именам через document.querySelector() и собирает их значения в один объект JavaScript. Затем этот объект превращается в JSON-данные через JSON.stringify(). И вот таким образом ты получаешь данные для отправки. Дальше их нужно отправить асинхронно на сервер, а на ответ от сервера прикрепить обработчик ответа. Поизучай XMLHttpRequest. Через него можно отправить на сервер и ответ сервера тоже через него берётся. У этого объекта есть событие “отправил”, на которое ты точно так же добавляешь event listener ещё до отправки запроса на сервер. Когда сервер принял запрос и ответил, на этом XMLHttpRequest-объекте возникает событие “отправил”, а на нём уже срабатывает обработчик события, который должен взять ответ сервера, отыскать в DOM нужный элемент через document.querySelector() и в него вывести результат ответа сервера в виде текста. Естественно, на каждом этапе ты можешь внедряться в данные и конвертировать их из кодов в тексты и из текстов в коды.
Таким образом, без перезагрузки страницы твоя страница будет общаться с сервером через работу скриптов JavaScript в фоне.

По такому принципу работают всякие почты типа Yandex, Mail.ru, Gmail: ты просто сидишь и ничего не делаешь, а там раз и показывается, что пришло новое сообщение. Это просто скрипты на JavaScript по таймеру проверяют почту, посылая запросы в фоне на сервер, и на ответы от сервера реагируют, меняя DOM страницы, загруженной в память браузера.



Отредактировано py.user.next (Авг. 30, 2019 04:04:47)

Офлайн

#7 Авг. 30, 2019 09:12:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Получение данных таблицы

Ethex
FishHook, подскажете что мне для этого нужно?
Прежде всего вам нужно погрузиться в волшебный мир JavaScript, это в любом случае необходимо, без JS современный веб немыслим.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version