@Muriam

Flask. Как сделать поиск на форме?

Как сделать поиск в БД при вводе слова в текстовое поле и нажатии на кнопку?

Если ввожу слово "Калина обыкновенная", то в результате на форме должно появиться сообщение:

Калина обыкновенная -> Калина -> Адоксовые

Здесь "Калина обыкновенная" это поле name в таблице species; "Калина" - это name в таблице genus; "Адоксовые" - это name в таблице family.

...

class Family(db.Model):
    __tablename__ = 'family'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40))
    with_species = db.relationship('Species', backref='family')

class Genus(db.Model):
    __tablename__ = 'genus'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40))
    with_species = db.relationship('Species', backref='genus')

class Species(db.Model):
    __tablename__ = 'species'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40))
    genus_id = db.Column(db.Integer, db.ForeignKey('genus.id'))
    family_id = db.Column(db.Integer, db.ForeignKey('family.id'))



class SpeciesForm(FlaskForm):
    find = StringField('название')
    findButton = SubmitField('найти')


@app.route('/species', methods=['GET', 'POST'])
def species():
    form = SpeciesForm()
    if form.validate_on_submit():
       ...
        return render_template('species.html', species=species, form=form)
    return render_template('species.html', form=form)


{% extends "index.html" %}

{% block content %}
<div id="content">

<form action="" method="POST">

    {{ form.hidden_tag() }}

<div class="items">

    <div class="item">
        <i>Поиск</i>
        <br><br>
        {{ form.find.label }}  {{ form.find() }}
        <br><br>
        {{ form.findButton }}
    </div>

</div>
</form>

</div>
{% endblock %}
  • Вопрос задан
  • 337 просмотров
Решения вопроса 1
ramzis
@ramzis
FullStackOverflow
class SpeciesForm(FlaskForm):
    find = StringField('название', validators=[DataRequired(message='Обязательное поле')])
    findButton = SubmitField('найти')


@app.route('/species', methods=['GET', 'POST'])
def species():
    form = SpeciesForm()
    if form.validate_on_submit():
        species_search = Species.query.filter(Species.name.like(f'%{form.find.data}%')).all()
        return render_template('species.html', species_search=species_search, form=form)
    return render_template('species.html', form=form)


{% for species in species_search %}
    <p>{{ species.name }} -> {{ species.genus.name }} -> {{ species.family.name }}</p> 
{% endfor %}
    <div id="content">
        <form action="" method="POST">
        
            {{ form.hidden_tag() }}
        
        <div class="items">
        
            <div class="item">
                <i>Поиск</i>
                <br><br>
                {{ form.find.label }}  {{ form.find() }}
                <br><br>
                {{ form.findButton }}
            </div>
        
        </div>
        </form>
        </div>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы