【发布时间】:2020-12-29 18:36:41
【问题描述】:
美好的一天,尝试通过构建一个存储联系信息的小型网络应用程序来提高我的网络技能。允许用户删除应用程序联系人的删除功能会显示成功消息,但索引页面不会显示数据库中的更改。
检查外部 DBReader(DB 浏览器)显示没有对数据库进行任何更改。根据此处的潜伏问题,request.form.get('affected_field_here') 的返回类型(我用来获取联系人 ID 的值)返回无。同样,我尝试使用 request.args / request.values 两者都显示相同的问题
那么另一双眼睛能告诉我我在哪里犯错了吗?
下面是删除功能
@app.route('/delete', methods=["GET", "POST"])
def delete():
conn = sqlite3.connect('contacts.db')
db = conn.cursor()
#Get contact_id
contact_id = request.args.get('contact_id')
db.execute("DELETE FROM contacts WHERE id =?", (contact_id,))
conn.commit()
conn.close()
flash('Contacts removed', 'success')
return redirect('/')
index.html 代码在这里
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
{% extends "base.html" %}
{% block title%}Landing Page{% endblock %}
{% block body %}
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="jumbotron p-3">
<h1>My Contacts <button type="button" class="btn btn-success float-right" data-toggle="modal"
data-target="#addcontact"> Add Contact</button></h1>
<!--------------------Add Contact Modal placed inside same holder as modalit's for-->
<div id="addcontact" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">Add Contact</h3>
</div>
<div class="modal-body">
<form action="/add" method="POST" autocomplete="off">
<div class="form-group">
<input autofocus class="form-control" autocomplete="off" required type="text" name="fname" placeholder="Enter first name">
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="text" required name="lname" placeholder="Enter Surname">
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="number" min="1" required name="age" placeholder="Enter Age">
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="number" name="contact" required placeholder="Enter Contact Number">
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="email" name="email" placeholder="Enter Email address">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Add Contact</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% with messages = get_flashed_messages(category_filter=["error"]) %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-danger alert-dismissible">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
<strong>Message: </strong>{{message}}
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% with messages = get_flashed_messages(category_filter=["success"]) %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-success alert-dismissible">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
<strong>Success: </strong>{{message}}
</div>
{% endfor %}
{% endif %}
{% endwith %}
<table class="table table-hover">
<thead>
<tr>
<td>ID</td>
<td>First Name</td>
<td>Surname</td>
<td>Age</td>
<td>Contact #</td>
<td>Email</td>
<td>Action</td>
</tr>
</thead>
<tbody>
{% for row in contacts %}
<tr>
<td>{{row['id']}}</td>
<td>{{row['fname']}}</td>
<td>{{row["lname"]}}</td>
<td>{{row['age']}}</td>
<td>{{row['number']}}</td>
<td>{{row['email']}}</td>
<td><button type="button" class="btn btn-primary" data-toggle="modal"
data-target="#editcontact{{row['id']}}">Edit</button>
<form style='display:inline;' action="/delete" method="POST">
<button type="submit" class="btn btn-danger""
onclick="return confirm('Are you sure you want to remove contacts?')">Delete</button></form>
</td>
</tr>
</tbody>
<div class="modal fade" id="editcontact{{row['id']}}" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">Contact Information</h5>
</div>
<div class="modal-body">
<form action="/edit" method="POST" autocomplete="off">
<div class="form-group">
<input autofocus class="form-control" autocomplete="off" required type="hidden" name="contact_id" value="{{row['id']}}" >
</div>
<div class="form-group">
<input autofocus class="form-control" autocomplete="off" required type="text" name="fname_edit" value="{{row['fname']}}" >
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="text" required name="lname_edit" value="{{row["lname"]}}">
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="number" min="1" required name="age_edit" value="{{row['age']}}" >
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="number" name="contact_edit" required value="{{row['number']}}" >
</div>
<div class="form-group">
<input class="form-control" autocomplete="off" type="email" name="email_edit" value="{{row['email']}}">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Save Contact</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endfor %}
</table>
</div>
</div>
</div>
{% endblock %}
appplication.py 的其余部分在这里可能有用:
from flask import Flask, render_template, request, flash, redirect, app, url_for, get_flashed_messages
import sqlite3
app = Flask(__name__)
app.secret_key = "this_is_a_secret" #need a key to start app
@app.route('/', methods=["GET", "POST"])
def index():
conn = sqlite3.connect('contacts.db')
db = conn.cursor()
contacts = db.execute("SELECT * FROM contacts")
directory = [] #to store values
for contact in contacts: #loop through query and append
directory.append({
"id": contact[0],
"fname": contact[1],
"lname": contact[2],
"age": contact[3],
"number": contact[4],
"email": contact[5]})
return render_template('index.html', contacts = directory) #load dic into html
@app.route('/add', methods=["POST"])
def add():
conn = sqlite3.connect('contacts.db')
db = conn.cursor()
if request.method == "POST": #general back end error checking
if not request.form.get('fname') or not request.form.get('lname'):
flash('First name and Surname are required fields.', 'error')
return redirect('/')
contact_age = request.form.get('age')
if contact_age.isdigit() == False:
flash ('Invalid age value', 'error')
return redirect('/')
contact_number = request.form.get('contact')
if contact_number.isdigit() == False:
flash ('Invalid contact number', 'error')
return redirect('/')
email = request.form.get('email')
fname = request.form.get('fname')
lname =request.form.get('lname')
db.execute("INSERT INTO contacts (fname, lname, age, number, email) VALUES(?,?,?,?,?)", (fname, lname, contact_age, contact_number, email))
conn.commit()
flash ('Updated your contact list', 'success')
return redirect('/')
@app.route('/edit', methods=["POST"])
def edit():
if request.method == "POST":
conn = sqlite3.connect('contacts.db')
db = conn.cursor()
contact_id = request.form.get('contact_id')
fname_n = request.form.get('fname_edit')
lname_n = request.form.get('lname_edit')
age_n = request.form.get('age_edit')
num_n = request.form.get('contact_edit')
email_n = request.form.get('email_edit')
db.execute("""UPDATE contacts SET fname = ? ,lname = ?,age = ?,number = ?, email = ? WHERE id= ?
""",
(fname_n,lname_n,age_n,num_n,email_n,contact_id ))
conn.commit()
flash('Contacts updated', 'success')
return redirect('/')
@app.route('/delete', methods=["GET", "POST"])
def delete():
conn = sqlite3.connect('contacts.db')
db = conn.cursor()
#Get contact_id
contact_id = request.args.get('contact_id')
db.execute("DELETE FROM contacts WHERE id =?", (contact_id,))
conn.commit()
conn.close()
flash('Contacts removed', 'success')
return redirect('/')
if __name__ == "__main__":
app.run(debug=True)
最后base.html引用了哪个index.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<title>{% block title %} {% endblock %} </title>
</head>
<body>
<div class="jumbotron p-3">
<div class="well text-center">
<h1>PRACTICE WEB APPLICATION</h1>
</div>
</div>
{% block body %}
{% endblock %}
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</html>
编辑:想出答案。在下面的帖子中回答。
【问题讨论】:
标签: html sqlite sql-delete