python - 从下拉建议中选择项目后更新 python 中的 sqlite 数据库

标签 python json typeahead.js cs50

我的程序必须更新表“idlist”idlist table从 js 中的下拉建议中选择项目后,在 python 中执行此操作。用户选择该项目,然后 python 中的 POST 请求将其添加到“idlist”表中。 当我运行该程序时,我收到以下错误消息:error message

非常感谢您的想法和建议:

这是我的Python代码:

def search():
    """Search for books that match query"""
    if request.method == "GET":
        if not request.args.get("q"):
            return render_template("adjust.html")
        else:
            q = request.args.get("q")  + "%"
            books = db.execute("SELECT Title, Author FROM book WHERE Title LIKE :q OR Author LIKE :q", q=q)
        return jsonify(books)
    if request.method == "POST" and request.form.get("title"):
        Title = request.form.get("title")
        insert_book = db.execute("INSERT INTO idlist (id,Title1, Status) VALUES (:id, :Title1, :Status)", id=session["user_id"], Title1=Title, Status="Not started")
        return redirect("/")
    return render_template("adjust.html")

这是 html:

{% extends "layout.html" %}

{% block title %}
    Add your Book
{% endblock %}
{% block main %}
    <form action="/adjust" method="POST">
        <div class="form-group">
        <p>Choose your Book</p>
        <label class="sr-only" for="q">Title, Author</label>
        <input class="form-control" id="q" placeholder="Title, Author" name="title" type="text" autocomplete="off" />
        </div>
        <button class="btn btn-primary" type="submit">Add</button>
    </form>
{% endblock %}

这是js:

function configure()
{
    // Configure typeahead
    $("#q").typeahead({
        highlight: false,
        minLength: 1
    },
    {
        display: function(suggestion) { return suggestion.Title; },
        limit: 10,
        source: search,
        templates: {
            suggestion: Handlebars.compile(
                "<div>"+
                "{{Title}}, {{Author}}" +
                "</div>"
            )
       }
    });

    // Give focus to text box
    $("#q").focus();
}


// Search database for typeahead's suggestions
function search(query, syncResults, asyncResults)
{
    // Get places matching query (asynchronously)
    let parameters = {
        q: query
    };
    $.getJSON("/adjust", parameters, function(data, textStatus, jqXHR) {

        // Call typeahead's callback with search results (Author Title)
        asyncResults(data);
    });
}

$(document).ready(function() {
   configure();
});

最佳答案

不要使用Ajax添加新书,这会让用户感到困惑,因为他不知道它是否已添加到idlist中,请使用Form POST 相反。

script.js 中删除以下 block

$("#q").on('typeahead:selected', function a(eventObject, suggestion, name) {
    ...
    ...
 });

要将所选项目添加到输入表单,请替换

display: function(suggestion) { return null; },

display: function(suggestion) { return suggestion.Title; },

要使表单POST,在adjust.html中替换

<form action="/adjust">
   ....
   <input class="form-control" id="q" placeholder="Title, Author" type="text"/>

<form action="/addbook" method="POST">
    ....
    <input class="form-control" id="q" placeholder="Title, Author" name="title" type="text" autocomplete="off" />

以及 addBook() 方法

@app.route("/addbook", methods=["GET", "POST"])
def addbook():
    """Add selected book"""
    if request.method == "POST" and request.form.get("title"):
        Title = request.form.get("title")
        insert_book = db.execute("INSERT INTO idlist (id,Title1, Status) VALUES (:id, :Title1, :Status)", id=session["user_id"], Title1=Title, Status="Not started")
        return redirect("/")
    # no "title" in the form, return to Add new book page
    return redirect("/adjust")

关于python - 从下拉建议中选择项目后更新 python 中的 sqlite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53923637/

相关文章:

python - 无法更改 PySide.QtGui 对象的 __class__

java - 如何编写使用 json 格式作为对象列表的 REST API 方法

javascript - 需要按产品对 JSON 数组进行分组。显示为逗号分隔的产品

c# - 将 typeahead.js 与 jquery ajax 调用一起使用

javascript - 使用 'remote' 时,Typeahead 和 Bloodhound 会显示不相关的建议

css - AngularJS:可滚动的提前输入字段

python - 虚拟环境 Python 2.4

python - 在 docker 容器中作为服务运行 py.test

python - 使用 django-allauth 在用户注册时创建用户和用户配置文件

python - TypeError : list indices must be integers, 不是带有 JSON 的 str