Моя функция поиска не разрешает правильный render_template и, следовательно, не отображает правильные данные - PullRequest
0 голосов
/ 20 июня 2020

Итак, у меня есть поле ввода, которое позволяет мне ввести некоторый текст и с помощью этого текста искать в моей базе данных любые подобные элементы.

У меня очень простой класс формы

from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

class searchForm(FlaskForm):
    seachInput= StringField('Search',validators=[DataRequired()])

Это отображено в моем обзоре. html такая страница


    <div class="container-right float-right">
        <form class="form-search" method="GET" action="/overview">
            <div class="row row-searchbar justify-content-center">
                <div class="col-4">
                    {{search.seachInput(class_='form-control mr-sm-2')}}
                </div>
                <div class="col-0">
                    <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
                </div>
            </div>
        </form>

Теперь я думаю, что у меня есть представление о том, где может быть проблема, потому что в обзоре. html есть несколько маршрутов. один для самого / обзора, другой для разбивки на страницы и, наконец, поискового запроса, он, кажется, всегда отображает этот

return render_template("overview.html",pagination=pagination,filter=filter,search=search)

@routes_blueprint.route('/overview',defaults={"page":1})
@routes_blueprint.route('/overview/<int:page>')
@routes_blueprint.route('/overview/<string:search>',methods=['GET'])
def overview(page):
    """ Overview page """
    filter =  checkBox()
    search = searchForm()
    page = page
    per_page = 3
    pagination = Comic.query.paginate(page,per_page,error_out=True)
    if search.validate_on_submit():
        searchQuery = search.seachInput.data
        format = "%{}%".format(searchQuery)
        results = Comic.query.filter(Comic.comicName.like(format)).all()
        return render_template('overview.html',results=results)
    return render_template("overview.html",pagination=pagination,form=filter,search=search)

В моем обзоре. html I используйте if, чтобы проверить, находятся ли какие-либо данные внутри переменной результатов


        <div class="row row-comics justify-content-start">
            {% if results %}
            {% for comics in results %}
            <div class="col-3 col-comics">
                <h2>{{comics.comicName}}</h2>
                <a href="{{url_for('routes.details',id=comics.comicId)}}" class="ClickableImage"><img
                        src="{{comics.comicImage}}"></a>
            </div>
            {% endfor %}

            {% else %}
            {% for comics in pagination.items %}
            <div class="col-3 col-comics">
                <h2>{{comics.comicName}}</h2>
                <a href="{{url_for('routes.details',id=comics.comicId)}}" class="ClickableImage"><img
                        src="{{comics.comicImage}}"></a>
            </div>
            {% endfor %}
            {% endif %}
        </div>

Всякий раз, когда я ввожу что-то в строку поиска, URL-адрес будет изменяться на /overview?search=yoursearchquery

, но данные не будут отображаться на странице обзора.

1 Ответ

1 голос
/ 20 июня 2020

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

class Comic(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255),
        nullable=False, unique=True, index=True)
class SearchForm(FlaskForm):
    qs = StringField('Search')
blueprint = Blueprint('comics', __name__)

@blueprint.route('/search')
def search():
    form = SearchForm(request.form)
    qs = request.args.get('qs')
    items = Comic.query.all() if not qs else \
        Comic.query.filter(Comic.title.like(f'%{qs}%')).all()
    return render_template('search.html', **locals())

@blueprint.route('/<int:id>')
def show(id):
    comic = Comic.query.get_or_404(id)
    return render_template('show.html', **locals())
<form method="GET">
    {{ form.qs() }}
    <button type="submit">Search</button>
</form>

<ul>
{% for item in items %}
    <li><a href="{{ url_for('comics.show', id=item.id) }}"{{ item.title }}</li>
{% endfor %}
</ul>

form.validate_on_submit() требуется действующий POST-запрос.

...