Как, используя 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'))
мне помогло. спасибо