Сейчас у меня есть список ингредиентов, который выглядит так:
{% block content %}
<form method = "POST">
<h1>DATA</h1>
{% for c in data %}
<h1>{{ c.i_id }} {{ c.name }}</h1>
{% endfor %}
</form>
{% endblock %}
У меня возникли проблемы с отображением каждого элемента как кликабельного, чтобы пользователь щелкнул один и добавил его в таблицу БД «userIngredients» со значениями u_id
и i_id
. u_id
уже хранится в session['u_id']
, однако i_id
— это то, что я пытаюсь извлечь из интерактивных элементов, поэтому я могу выполнять следующий запрос при каждом щелчке: 'INSERT INTO userIngredients VALUES(%s,%s)',(session[u_id],i_id)
@app.route('/addingredients', methods=['GET','POST'])
def addingredients():
c = sq.connection.cursor()
result = c.execute('SELECT * FROM Ingredients')
data = c.fetchall()
return render_template('user/addIngredients.html', data=data)
Просто используйте для этого обычный HTML.
<a href = "/addingredients/{% session['u_id'] %}/{% c.i_id %}">{{ c.i_id }} {{ c.name }}</a>
Нажатие на это должно вызвать ответ на вашу конечную точку, где вы можете использовать следующий код, чтобы добавить ее в базу данных.
@app.route('/addingredients/<user_id>/<ingredient_id>')
def add_ingredients(user_id, ingredient_id):
# Important to cast the strings here to integers
# both as protection from SQL injection and to make sure
# the values are inserted as actual integers
user_id = int(user_id)
ingredient_id = int(ingredient_id)
c = sq.connection.cursor()
c.execute('INSERT INTO userIngredients VALUES(%s,%s)', (user_id,ingredient_id))
# Then if you want, you can re-render the template
result = c.execute('SELECT * FROM Ingredients')
data = c.fetchall()
return render_template('user/addIngredients.html', data=data)
Я бы переместил рендеринг в другую конечную точку, чем /addingredients
, так как имя не совсем соответствует шаблону. Если вы можете, я бы предложил использовать либо RESTful /ingredients/add
, чтобы добавить новый ингредиент и /ingredients
, чтобы получить список всех ингредиентов, либо /getingredients
и /addingredients
, чтобы сделать то же самое.