Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 26, 2024 15:08:56

vbsm
Зарегистрирован: 2024-02-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask возврат к предыдущей страницы в результатах поиска

Здравствуйте.

Помогите найти причину проблемы. С решением попробую разобраться сам.

У меня приложение на flask с самописным разделением на страницы и без ORM. Пример маршрута:

 @bp.route("/search", methods=["GET", "POST"])
@login_required
def search_document():
    """
    Search document.
    """
    # Get current page.
    page = request.args.get("page", default=1, type=int)
    # For completion on page get all part_ids.
    partners_datalist = [s[0] for s in search.get_unique_partners()]
    # Form and choices.
    form = SearchDocument()
    form.org_id.choices = [(o[0], o[1]) for o in search.get_orgs()]
    if form.is_submitted():
        matches = search.get_num_matches(
            form.search_name.data,
            form.start_date.data,
            form.end_date.data,
            form.storage_until.data,
            form.org_id.data,
            form.part_name.data,
            form.type_id.data,
            form.comment.data
        )
        limit = 10
        offset = (page - 1) * limit if page > 1 else 0
        # Always round to upper.
        pages = matches // limit + (matches % limit > 0)
        # Get next/previous page number and link based on current
        # page, matches and per page limit.
        prev_url = (url_for("search.search_document", page=page - 1) if page > 1
                    else None)
        next_url = (url_for("search.search_document", page=page + 1,
                            search_name=form.search_name.data,
                            start_date=form.start_date.data,
                            end_date=form.end_date.data,
                            storage_until=form.storage_until.data,
                            org_id=form.org_id.data,
                            part_name=form.part_name.data,
                            type_id=form.type_id.data,
                            comment=form.comment.data) if page < pages
                    else None)
        page_minus_two_url = (url_for("search.search_document", page=page - 2) if page > 3
                              else None)
        page_plus_two_url = (url_for("search.search_document", page=page + 2) if page < pages - 1
                             else None)
        first_page_url = (url_for("search.search_document", page=1) if page > 2
                          else None)
        last_page_url = (url_for("search.search_document", page=pages) if pages > 2 and page < pages - 2
                         else None)
        # Actual results.
        found_docs = search.search_document(
            form.search_name.data,
            form.start_date.data,
            form.end_date.data,
            form.storage_until.data,
            form.org_id.data,
            form.part_name.data,
            form.type_id.data,
            form.comment.data,
            form.order_field.data,
            form.order_direction.data,
            limit,
            offset
        )
        return render_template("search_results.html",
                               results=found_docs,
                               search_name=form.search_name.data,
                               start_date=form.start_date.data,
                               end_date=form.end_date.data,
                               storage_until=form.storage_until.data,
                               org_id=form.org_id.data,
                               part_name=form.part_name.data,
                               type_id=form.type_id.data,
                               comment=form.comment.data,
                               order_field=form.order_field.data,
                               order_direction=form.order_direction.data,
                               prev_url=prev_url,
                               next_url=next_url,
                               page_plus_two_url=page_plus_two_url,
                               page_minus_two_url=page_minus_two_url,
                               first_page_url=first_page_url,
                               last_page_url=last_page_url,
                               matches=matches,
                               page=page,
                               pages=pages)
    return render_template("search.html", form=form,
                           partners_datalist=partners_datalist)

На странице результатов поиска есть различные действия с выведенными документами, например, удаление. Я хочу чтобы нажатие на кнопку удаления, которое обрабатывается через маршрут
@bp.route("/delete/<int:doc_id>", methods=["GET", "POST"])
...
return redirect(url.referrer)
по завершению процедуры удаления документа возвращало пользователя на ту же страницу поиска, на которой он был до нажатия на кнопку удаления. При использовании моего кода после отработки маршрута удаления происходит возврат к форме поиска по маршруту
@bp.route("/search", methods=["GET", "POST"])
, несмотря на использовании в маршруте удаления инструкции перенаправления на предыдущую страницу. Я подозреваю, что дело в том, что я из формы поиска при формировании результатов поиска в адресную строку не передаю параметры поиска и текущую страницу. Я правильно думаю?

P. S. Если возможно обойтись без JS, я хотел бы это сделать.

Офлайн

#2 Апрель 27, 2024 05:38:22

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

Flask возврат к предыдущей страницы в результатах поиска

vbsm
возвращало пользователя на ту же страницу поиска, на которой он был до нажатия на кнопку удаления
Чтобы он десять раз мог удалять одно и то же уже удалённое?
vbsm
Если возможно обойтись без JS
Ну вообще, взаимодействовать с пользователем надо через JavaScript. А вот то, что оно там делает на самом деле, должно быть на сервере. Поэтому пользователь взаимодействует с JavaScript-скриптами, а они уже передают информацию серверной части с указаниями, что нужно сделать, и просходит это в фоновом режиме незаметно для пользователя.

Можешь, конечно, переискивать это всё заново, при каждом нажатии кнопки удаления делать перепоиск того, что было уже найдено до этого, запросы какие-то снова посылать на сервер, загружать ответы с сервера.

Но вообще, должно быть так. Пользователь нажал кнопку удалить у пункта. Удаляемый пункт удаляется (скрывается), а заодно на API в фоновом режиме посылается сообщение “удалить то-то”. Пользователь видит, что оно удалилось. Если он обновит страницу, оно там тоже будет удалённым. При этом никаких перепоисков делать не надо.

vbsm
Я подозреваю, что дело в том, что я из формы поиска при формировании результатов поиска в адресную строку не передаю параметры поиска
Тебе надо эти параметры, с которыми ты искал, взять и заново искать с ними. То есть в странице с кнопками удаления у тебя должны быть эти параметры известны, а значит переданы изначально. Но даже если они у тебя будут передаваться, то тебе просто некуда их подавать, потому что на API у тебя нет поискового механизма, куда можно подать параметры, чтобы оно произвело поиск и вернуло найденные по этим параметрам данные. Где вот этот механизм? Нет его.

Если ты хочешь без JavaScript работать, то ты должен сначала тогда сделать всю эту инфраструктуру, которая позволит тебе без JavaScript все эти удобности делать.



Отредактировано py.user.next (Апрель 27, 2024 07:20:10)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version