Динамические id для тега

Я хочу решить типичную задачу. У меня есть список блюд, он берется волшебным образом из базы данных и выводится в

<div id="midlebox">{% for row in result %}<p>{{row[0]}}</p>{% endfor %}</div>

ла-ла , в примере кода увидите. НО есть проблема, я не знаю как присвоить каждому выведенному на экран значению его id.

Мне это нужно, чтобы по нему потом получить информацию о том, какой текст содержится внутри тега. Если есть другой способ получить текст из тега , более логичный и простой, тоже хорошо. Собственно мне это все нужно, чтобы пользователь зашел в свой личный кабинет и увидел в табличке , какие блюда он добавил в свой ежедневный рацион (условно по нажатию чекбокса рядом с названием блюда, содержание тега падает в базу данных и потом из нее просто отображается в личном кабинете пользователя, доступ к которому также имеет его врач).

Все это в рамках моей научки по рекомендациям к питанию для больных диабетом 1ого и 2ого типа. Надеюсь скоро добавлю туда калорийность, сахоросодержание и прочие параметры, но пока бы придумать как устроить подобное взаимодействие с пользователем. Иначе не понятно , что он ест , в каких кол-вах и как ему помочь. Большая часть работы реализована с помощью Python - FLask и базами данных .db а так же html css.

@app.route('/search', methods=['POST'])
def search():
    if request.method == 'POST':
        query = (request.form['input_query'],)
        con = sqlite3.connect('diacompanion.db')
        cur = con.cursor()
        cur.execute("""SELECT name 
                       FROM constant_food 
                       WHERE category = ?""", (query))
        result = cur.fetchall()
        return render_template('index.html', result=result)

Репозиторий на GitHub


Ответы (1 шт):

Автор решения: Reanimatolog

Вот несколько правок:

файл manage.py

@app.route('/search', methods=['POST'])
def search():
    search_string = request.form['input_query']
    con = sqlite3.connect('diacompanion.db')
    cur = con.cursor()
    cur.execute("SELECT DISTINCT (category) category ,_id FROM"
                " constant_food WHERE category LIKE ? GROUP BY category", ('%{}%'.format(search_string),))
    result = cur.fetchall()
    return render_template('index.html', result=result)

@app.route('/patient_ration', methods=['POST'])
def patient_ration():
    return render_template('index.html', result=request.form)

"LIKE" добавлено в запрос, потому что пользователь может не знать точно, как называется категория продуктов. Можно почитать здесь

Выводиться будут только найденные названия категорий. Чтобы они не повторялись в запрос включены DISTINCT и GROUP BY

Второй роут просто для примера как будет отрабатывать форма

файл index.html

                    <div id="midlebox">
                    <form method='post' action='/patient_ration'>
                        {% for row in result %}
                            <div class="form-check">
                                <input type="checkbox" class="form-check-input" name="{{row[1]}}" id="{{row[1]}}">
                                <label class="form-check-label" for="{{row[1]}}">{{ row[0] }}</label>
                            </div>
                        {% endfor %}
                        <button type="submit" class="btn btn-primary">ОК</button>
                    </form>
                </div>

Там будет список всех категорий которые попадут под строку ввода. Например, если ввести "мяс", то подходят сразу две.

скрин с "мясом"

Чтобы избежать использования JavaScript, предлагаю сделать одну кнопку, подтверждающую выбор пациентом набора продуктов. По нажатию этой кнопки ОК данные формы будут обрабатываться внутри

@app.route('/patient_ration', methods=['POST'])

Да, нашел тут кое-что, может пригодиться: Дистанционный мониторинг состояния больных сахарным диабетом

→ Ссылка