Колба - как сохранить индекс списка после отправки формы? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть список изображений, которые я хочу отобразить на странице.Эти имена изображений отформатированы в основном YYYYMMDD_HHMMSS.jpg.Я хочу, чтобы на этой единственной странице были перечислены все изображения или только перечислены и показаны те, которые были сделаны в определенный день (имеется в виду главная страница, а не /index для отображения всех изображений, /date-specific для отображения некоторых изображений).

До сих пор я мог показывать все изображений и нажимать кнопки «следующий» / «предыдущий» для циклического просмотра всех изображений.У меня также есть таблица под изображением, показывающая все изображения, которые есть в индексе.

Отлично работает - никаких проблем.

Однако я также пытаюсь реализовать фильтр дат, гдепользователь может выбрать дату из средства выбора календаря, чтобы сайт отфильтровывался и показывал фотографии только в этот день.Пока я могу успешно фильтровать один раз.Однако когда я нажимаю кнопки «Далее» / «Предыдущий» или выбираю изображение из таблицы, оно возвращается к полному списку изображений.

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

Я также попытался включитьсписок в части HTML, но он по-прежнему возвращает все фотографии.(Также делает URL уродливым, поскольку он включает в себя список изображений для каждой фотографии, указанной в таблице):

<td><a href="{{ url_for('default_template', chosen_image=image, image_list=image_list) }}"> {{ image }} </a></td>

Вот .gif страницы, которую яработает над. .Во-первых, вы увидите, что я могу успешно кликать, перемещаться между всеми фотографиями.Затем я могу успешно фильтровать, чтобы показать фотографии на определенную дату.Тем не менее, все прошлое, которое продолжает посылать меня обратно в полный список изображений.

В любом случае, без лишних слов, вот коды.(Обратите внимание, я стараюсь сохранить его минимальным, поэтому, возможно, пропустил важную часть, поэтому, пожалуйста, дайте мне знать, если мне нужно опубликовать что-то еще здесь):

rout.py

import os
import random
from flask import render_template, url_for, request, Blueprint, redirect  # noqa
from app import app

IMAGE_FOLDER = r"C:/MyPath/Test"
FAVORITE_LIST = os.path.join(IMAGE_FOLDER, "favorites.txt")

blueprint = Blueprint('images', __name__,
                      static_url_path='/static/images',
                      static_folder=IMAGE_FOLDER)
app.register_blueprint(blueprint)

images = os.listdir(IMAGE_FOLDER)


image_urls = ["20190411_123200.jpg", ... other images in a list]

class Photo_Index():
    def __init__(self, index=0):
        self.index = index

    def increase_number(self, num_images):
        if self.index == num_images:
            self.index = 0
        else:
            self.index = self.index + 1
        return self.index

    def decrease_number(self, num_images):
        if self.index == 0:
            self.index = num_images
        else:
            self.index = self.index - 1
        return self.index

    def random_number(self, num_images):
        self.index = random.randint(0, num_images)
        return self.index

    def set_number(self, number):
        self.index = number
        return self.index


# functions to create and edit Favorites. this works so I'm excluding]


def day_month_year(filename):
    """
    Takes a string `20190212` and pulls out Year, Month, Date
    """
    year = filename[:4]
    month = filename[4:6]
    day = filename[6:8]
    return str(year + "-" + month + "-" + day)


def get_files_on(specific_date):
    _files = []
    print("\nLooking for files on:", specific_date, "\n")
    for file in image_urls:
        # print(file, day_month_year(file))
        if day_month_year(file) == specific_date:
            _files.append(file)
    return _files


photo_index_obj = Photo_Index()
fav_photo_index = Photo_Index()


def update_index(rqst, indx_obj, num_images):
    print("Updating index, have", num_images, "photos")
    if num_images == 1:
        indx_obj.set_number(0)
    elif 'prev-photo' in rqst.form:
        indx_obj.decrease_number(num_images)
    elif 'next-photo' in rqst.form:
        indx_obj.increase_number(num_images)
    elif 'random-photo' in rqst.form:
        indx_obj.random_number(num_images)
    return indx_obj

@app.route("/<chosen_image>", methods=["GET", "POST"])
@app.route("/", methods=["GET", "POST"])
def default_template(date=None, image_list=None, chosen_image=None):
    if image_list is None:
        image_list = image_urls
    num_images = len(image_list) - 1
    if request.method == "POST":
        if 'go-to-date' in request.form:
            date = request.form['go-to-date']
            image_list = get_files_on(date)
            num_images = len(image_list) - 1
            photo_index_obj.set_number(0)
            if len(image_list) == 0:
                image_list = ["no_images_for_date.jpg"]
        elif 'prev-next-buttons' in request.form:
            print("Updating index, have", num_images, "photos")
            update_index(request, photo_index_obj, num_images)
        elif 'favorite-photo' in request.form:
            add_to_favorites(image_list[photo_index_obj.index])
        elif 'un-favorite-photo' in request.form:
            remove_from_favorites(image_list[photo_index_obj.index])
    if chosen_image is None:
        chosen_image = image_list[photo_index_obj.index]
    elif chosen_image is not None:
        photo_index_obj.set_number(image_list.index(chosen_image))
    favorite = is_favorite(image_list[photo_index_obj.index])
    print("Images:", image_list)
    return render_template('index.html',
                           title="Local Image Viewer",
                           photo_index=photo_index_obj.index,
                           image=chosen_image,
                           image_list=image_list,
                           favorite=favorite)

@app.route("/<chosen_image>", methods=["GET", "POST"])
def chosen_image(chosen_image):
    date = request.form['go-to-date']
    return default_template(date=date,
                            chosen_image=chosen_image)

index.html (я опустил список выбора, так как это немного лишнее для этого поста)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>{{ title }}</title>
    <link rel="stylesheet" type="text/css" href= "{{ url_for('static',filename='styles/index.css') }}">
    <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
</head>
<body>
{% extends "layout.html" %}
{% block content %}
    <h3>Index: {{ photo_index }}</h3>
    <h3>Filename: {{ image }}</h3>
    <div id="calendar-selector">
    {% include "/HTML Snippets/calendar.html" %}
    </div>
    <div class='image-container' id='image'>
        {% include "/HTML Snippets/favorite_button.html" %}
        <img src="{{ url_for('images.static', filename=image) }} " id="the-photo">
    </div>
    <div class='button-container' id='buttons'>
        <form action="" method="post">
            <input type="hidden" name="prev-next-buttons">
            <input type="submit" value="Prev photo" name='prev-photo'>
            <input type="submit" value="Next photo" name='next-photo'>
            <input type="submit" value="Random photo" name='random-photo'>
            <br/>
            <button type='button' id='rotate-button' onclick="rotateMeCounterClockwise('#the-photo')">Rotate Photo CounterClockwise</button>
            <button type='button' id='rotate-button' onclick="rotateMeClockwise('#the-photo')">Rotate Photo Clockwise</button>
        </form>
    </div>
    <div class='table-container'>
        <table id='image-list' name='select-from-table'>
            {% for image_row in image_list | batch(3) %}
            <tr>
                {% for image in image_row %}
                <td><a href="{{ url_for('default_template', chosen_image=image) }}"> {{ image }} </a></td>
                {% endfor %}
            </tr>
            {% endfor %}
        </table>
    </div>
{% endblock %}
</body>
</html>

и бит календаря calendar.html

{% block topscripts %}
    <link rel="stylesheet" type="text/css" href= "{{ url_for('static',filename='styles/calendar.css') }}">
    <script>
        $(function() {
            $("#datepicker").datepicker({dateFormat: 'yy-mm-dd'});
        });
    </script>    
{% endblock %}

{% block content %}
<form method="post" action="{{ url_for('default_template') }}">
    <input type="hidden" name="calendar-form">
    <p>
        Date: <input type="text" id="datepicker"  name='go-to-date'
        {% if request.form['go-to-date'] is not none %}
            value="{{request.form['go-to-date']}}"
        {% endif %}

        ></p>
    <input type="submit">
</form>
{% endblock %}

{% block endscripts %}

{% endblock %}

1 Ответ

1 голос
/ 17 апреля 2019

Вам необходимо передать достаточно информации в следующей / предыдущей форме и в ссылках таблицы, чтобы повторно применить фильтр даты.Ваша календарная форма отделена от следующей / предыдущей навигационной формы, браузер не будет сериализовывать информацию из одной при отправке другой.Клики по ссылкам <a href="..."> также не будут включать значение поля ввода даты.

Обратите внимание, что щелчки по ссылкам таблицы генерируют запросы GET, поэтому вам нужно искать go-to-date в request.valuesотображение для размещения как параметров запроса, так и данных формы.

Этот параметр нужно искать не только при получении запроса POST, но и для всех запросов:

if 'go-to-date' in request.values:
    date = request.values['go-to-date']
    image_list = get_files_on(date)
    photo_index_obj.set_number(0)
    if len(image_list) == 0:
        image_list = ["no_images_for_date.jpg"]
else:
    image_list = image_list or image_urls
num_images = len(image_list) - 1

if request.method == 'POST':
    # ...

Затем создайте URL-адреса, содержащие параметр:

{%- set url_params = {'go-to-date': request.values['go-to-date']} if request.values['go-to-date'] else {} -%}
{% for image in image_row %}
<td><a href="{{ url_for('default_template', chosen_image=image, **url_params) }}"> {{ image }} </a></td>
{% endfor %}

Для формы next/previous просто добавьте скрытое поле ввода с текущим значением go-to-date:

<form action="" method="post">
    <input type="hidden" name="prev-next-buttons">
    {%- if request.values['go-to-date'] -%}
    <input type="hidden" name="go-to-date" value="{{ request.values['go-to-date'] }}">
    {%- endif -%}

    <input type="submit" value="Prev photo" name='prev-photo'>
    <input type="submit" value="Next photo" name='next-photo'>
    <input type="submit" value="Random photo" name='random-photo'>
    <br/>
    <button type='button' id='rotate-button' onclick="rotateMeCounterClockwise('#the-photo')">Rotate Photo CounterClockwise</button>
    <button type='button' id='rotate-button' onclick="rotateMeClockwise('#the-photo')">Rotate Photo Clockwise</button>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...