#python #sqlite #flask #jinja2
#python #sqlite #flask #jinja2
Вопрос:
Я изучаю Python с помощью обучающего приложения от Flask и не могу понять, как ссылаться на определенную строку в базе данных. Я пытаюсь удалить запись, используя ссылку удалить в шаблоне.Я потратил целый день, пробуя все, что мог найти, и чтобы действительно понять это. Я знаю, что это просто, но я не понимаю!
Вот шаблон html:
<ul class=entries>
{% for entry in entries %}
<li><h2>{{ entry.title }}
<h2>{{ entry.text|safe }}</h2>
{% if session.logged_in %}
<a href="{{ url_for('delete_entry') }}">Delete</a>
{% endif %}
{% else %}
{% endfor %}
</ul>
Как вы можете видеть, рядом с каждой записью есть ссылка на удаление.Как я должен ссылаться на
правильный идентификатор в базе данных?
Вот функция Python, которая у меня есть до сих пор:
@app.route('/delete')
def delete_entry():
if not session.get('logged_in'):
abort(401)
g.db.execute('delete from entries where id=(select max(id)from entries)')
g.db.commit()
flash('The entry was deleted')
return redirect(url_for('show_entries'))
То, что у меня есть до сих пор, работает, но это не то, что я хочу. Заранее спасибо!
Комментарии:
1. Я отредактировал свой ответ, теперь у вас есть полный код, чтобы заставить его работать в Flask
Ответ №1:
Себастьян функция delete_entry удаляет последнюю запись в БД
where id=(select max(id)from entries)
Что вам нужно сделать, это вставить параметр в URL для удаления, например ‘/ delete/:id’, где id — это идентификатор записи, которую вы хотите удалить, затем измените шаблон, чтобы сгенерировать URL таким образом:
<a href="{{ url_for('delete_entry', entry.id) }}">Delete</a>
А также измените запрос БД, который удаляет запись:
g.db.execute('delete from entries where id=' id)
Правка1:
Я проверил документацию Flask, чтобы получить переменные в ваши маршруты, вы должны изменить маршрут следующим образом:
@app.route('/delete/<int:entry_id>')
Таким образом, вы получаете entry_id в вашей функции python:
def delete_entry(entry_id):
g.db.execute('delete from entries where id=' entry_id)
И, наконец, вы должны указать свой идентификатор записи в функции url_for:
<a href="{{ url_for('delete_entry', entry_id = entry.id) }}">Delete</a>
Комментарии:
1. спасибо, что указали мне правильное направление. Я получаю Werkzeug»BuildError: (‘delete_entry, entry.id ‘, {}, Нет), но я собираюсь почитать о Werkzeug подробнее. По крайней мере, теперь я понимаю больше. Я не буду продолжать искать в неправильных местах.
2. виноват, я забыл ввести аргумент в функцию … упс!
3. как получилось так: g.db.execute(‘удалить из записей, где id =’ entry_id) Дает мне следующее: невозможно объединить объекты ‘str’ и ‘int’. Я знаю, что id — это целое число, но почему здесь оно рассматривается как строка? Кстати, почему вы должны объединять идентификатор с entry_id?
4. Я не могу поверить, что все, что мне нужно было сделать, это: entry_id=str(entry_id) g.db.execute(‘удалить из записей, где id=’ entry_id) Самый простой способ преобразовать целое число в строку, и я перепробовал все остальное, кроме этого. Еще раз спасибо @Фернандо!
5. Извините, что я не читал этого до сих пор… что ж, я рад, что ты смог найти свой путь. Поздравляю!