Как, используя Flask, Form, sqlite3, мне добавить функционал в кнопку Delete?

У меня уже есть рабочая кнопка в форме edit. инфа берется из базы sqlite3. рядом с ней поместил delete. но как задействовать ее? можно просто item_id прикрепить в editor? Вот мой код в шаблоне:

from flask import Flask, render_template, redirect, url_for, request, session, flash
import sqlite3
import hashlib
import os
from werkzeug.utils import secure_filename

app = Flask(__name__)
app.secret_key = 'your_test_key'

def get_db_connection():
    conn = sqlite3.connect('database_v1_2.db')
    conn.row_factory = sqlite3.Row
    return conn

@app.route('/')
def home():
    conn = get_db_connection()
    contents = conn.execute('SELECT * FROM contents').fetchall()
    conn.close()

    contents_list = [dict(ix) for ix in contents]
    #print(contents_list)

    json_data = {}
    for raw in contents_list:
        if raw['idmenu'] not in json_data:
            json_data[raw['idmenu']] = []

        json_data[raw['idmenu']].append({
            'id': raw['id'],
            'title': raw['title'],
            'content': raw['content'],
            'idcard': raw['idcard'],
            'idmenu': raw['idmenu'],
            'author': raw['author'],
            'date': raw['date']
        })
    #print(json_data)
    
    return render_template('index.html', json_data=json_data)

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        hashed_password = hashlib.sha256(password.encode('utf-8')).hexdigest()

        conn = get_db_connection() 
        user = conn.execute('SELECT * FROM users WHERE username = ?', (username,)).fetchone()
        conn.close() 

        if user and user['password'] == hashed_password:
            session['user_id'] = user['id']
            return redirect(url_for('panel'))
        else:
            error = 'Неправильное имя пользователя или пароль'
            print(error)

    return render_template('login.html', error=error)

@app.route('/logout')
def logout():
    session.clear()
    return redirect(url_for('home'))

@app.route('/editor', methods=['POST'])
def update_item():
    if request.method == 'POST':
        item_id = request.form['item_id']
        item_title = request.form['item_title']
        item_content = request.form['item_content']
        item_menu = request.form['item_menu']
        item_card = request.form['item_card']

        conn = get_db_connection()
        conn.execute('UPDATE contents SET title = ?, content = ?, idmenu = ?, idcard = ? WHERE id = ?', (item_title, item_content, item_menu, item_card, item_id))
        conn.commit()
        conn.close()
        return redirect(url_for('panel'))
    
@app.route('/editor', methods=['POST'])
def delete_item():
    if request.method == 'POST':
        item_id = request.form['item_id']
        conn = get_db_connection()
        conn.execute('DELETE FROM contents WHERE id = ?', (item_id,))
        conn.commit()
        conn.close()
        return redirect(url_for('panel'))

@app.route('/panel')
def panel():
    if 'user_id' not in session:
        return redirect(url_for('login'))
    
    conn = get_db_connection()
    contents = conn.execute('SELECT * FROM contents').fetchall()
    conn.close()

    contents_list = [dict(ix) for ix in contents]
    #print(contents_list)

    json_data = {}
    for raw in contents_list:
        if raw['idmenu'] not in json_data:
            json_data[raw['idmenu']] = []

        json_data[raw['idmenu']].append({
            'id': raw['id'],
            'title': raw['title'],
            'content': raw['content'],
            'idcard': raw['idcard'],
            'idmenu': raw['idmenu'],
            'author': raw['author'],
            'date': raw['date']
        })
    print(json_data)
    
    return render_template('panel.html', json_data=json_data)

@app.route('/create', methods=('GET', 'POST'))
def create():
    if request.method == 'POST':
        item_title = request.form['item_title']
        item_content = request.form['item_content']
        item_menu = request.form['item_menu']
        item_card = request.form['item_card']

        if not item_title:
            flash('Title is required!')
        elif not item_content:
            flash('Content is required!')
        elif not item_menu:
            flash('Menu is required!')
        elif not item_card:
            flash('Menu is required!')
        else:
            conn = get_db_connection()
            conn.execute('INSERT INTO contents (title, content, idmenu, idcard) VALUES (?, ?, ?, ?)', (item_title, item_content, item_menu, item_card))
            conn.commit()
            conn.close()
            return redirect(url_for('panel')) 
    return render_template('create.html')

if __name__ == '__main__':
    app.run(debug=True)

код страницы editor:

<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
    <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
        <h1 class="h2">Добро пожаловать в Админ-Панель</h1>
    </div>
    <div class="d-flex align-items-start">
        <!--<div class="nav flex-column nav-pills me-3" id="v-pills-tab" role="tablist" aria-orientation="vertical">
        </div>-->
        <div class="tab-content" id="v-pills-tabContent">
            {% for j_key, j_value in json_data.items() %}
                <div class="tab-pane fade" id="v-pills-{{ j_key }}" role="tabpanel"
                     aria-labelledby="v-pills-{{ j_key }}-tab" style="position: absolute;">
                    {% for item in j_value %}
                        <form method="POST" action="/editor">
                            <input type="hidden" name="item_id" value="{{ item.id }}">
                            <p>Title: <textarea name="item_title">{{ item.title }}</textarea></p>
                            <p>Content: <textarea name="item_content">{{ item.content }}</textarea></p>
                            <p>Menu: <textarea name="item_menu">{{ item.idmenu }}</textarea></p>
                            <p>Card: <textarea name="item_card">{{ item.idcard }}</textarea></p>
                            <button type="submit" class="btn btn-primary">Edit</button>
                            <button type="submit" class="btn btn-primary">Delete</button>
                        </form>
                    {% endfor %}
                </div>
            {% endfor %}
        </div>
    </div>
</main>

на всякий случай приложу код панель страницу, в которую включен editor

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Админ-Панель</title>
    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<!-- Header -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container-fluid">
        <a class="navbar-brand" href="#">Логотип</a>
        <div class="d-flex align-items-center">
            <span class="me-3">Привет, Админ</span>
            <a href="{{ url_for('logout') }}" class="btn btn-outline-secondary">Выход</a>
        </div>
    </div>
</nav>


<!-- Admin Panel Layout -->
<div class="container-fluid">
    <div class="row">
        <!-- Sidebar Menu -->
        <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
            <div class="position-sticky pt-3">
                <ul class="nav flex-column">
                    <li class="nav-item">
                        <a class="nav-link active" aria-current="page" href="#">
                            <span data-feather="home"></span>
                            Редактор
                        </a>
                    </li>
                    <!-- More menu items -->
                    <li class="nav-item">
                        <a class="nav-link" href="/create">Add</a>
                    </li>
                    <!--<li class="nav-item">
                        <a class="nav-link" href="/delete_item">Del</a>
                    </li>-->
            {% for j_key, j_value in json_data.items() %}
                    <li class="nav-item">
                        <a class="nav-link" id="v-pills-{{ j_key }}-tab" data-bs-toggle="pill" data-bs-target="#v-pills-{{ j_key }}" type="button" role="tab" aria-controls="v-pills-{{ j_key }}" aria-selected="false" href="#">
                            {{ j_value[0].idmenu }}
                        </a>
                    </li>
            {% endfor %}

                </ul>
            </div>
        </nav>

        <!-- Main Content -->
        {% if json_data %}
            {% include 'editor.html' %}
        {% else %}
            <main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
                <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
                    <h1 class="h2">Добро пожаловать в Админ-Панель</h1>
                </div>

                <!-- Content goes here -->
                <div class="d-flex align-items-start">
                    <p>Данные пока отсутвуют или их не получилось получить из БД</p>
                </div>


            </main>
        {% endif %}

    </div>
</div>

<!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

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

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

ориентируясь ответу в комментарии на мой вопрос @strawdog правильно разделить формы таким образом:

<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
    <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
        <h1 class="h2">Добро пожаловать в Админ-Панель</h1>
    </div>
    <div class="d-flex align-items-start">
        <div class="tab-content" id="v-pills-tabContent">
            {% for j_key, j_value in json_data.items() %}
                <div class="tab-pane fade" id="v-pills-{{ j_key }}" role="tabpanel"
                     aria-labelledby="v-pills-{{ j_key }}-tab" style="position: absolute;">
                    {% for item in j_value %}
                        <form method="POST" action="/editor">
                            <input type="hidden" name="item_id" value="{{ item.id }}">
                            <p>Title: <textarea name="item_title">{{ item.title }}</textarea></p>
                            <p>Content: <textarea name="item_content">{{ item.content }}</textarea></p>
                            <p>Menu: <textarea name="item_menu">{{ item.idmenu }}</textarea></p>
                            <p>Card: <textarea name="item_card">{{ item.idcard }}</textarea></p>
                            <button type="submit" class="btn btn-primary">Edit</button>                         
                        </form>
                        <form method="POST" action="/cleaner">
                            <input type="hidden" name="item_id" value="{{ item.id }}">
                            <button type="submit" class="btn btn-primary">Delete</button>                       
                        </form>                     
                    {% endfor %}
                </div>
            {% endfor %}
        </div>
    </div>
</main>

и в шаблоне добавить функцию:

@app.route('/editor', methods=['POST'])
def update_item():
    if request.method == 'POST':
        item_id = request.form['item_id']
        item_title = request.form['item_title']
        item_content = request.form['item_content']
        item_menu = request.form['item_menu']
        item_card = request.form['item_card']
        conn = get_db_connection()
        conn.execute('UPDATE contents SET title = ?, content = ?, idmenu = ?, idcard = ? WHERE id = ?', (item_title, item_content, item_menu, item_card, item_id))
        conn.commit()
        conn.close()
        return redirect(url_for('panel'))
    
@app.route('/cleaner', methods=['POST'])
def delete_item():
    if request.method == 'POST':
        item_id = request.form['item_id']
        conn = get_db_connection()
        conn.execute('DELETE FROM contents WHERE id = ?', (item_id,))
        conn.commit()
        conn.close()
        return redirect(url_for('panel'))

мне помогло. спасибо

→ Ссылка