【问题标题】:Star Rating Bootstrap Data Input to Flask星级引导数据输入到烧瓶
【发布时间】:2018-03-15 23:49:22
【问题描述】:

在获得此功能的许多帮助和多次尝试之后,我现在已经这样做了。如果其他人也想做同样的事情,下面的代码应该就足够了。

Jinja2 模板

<div class="panel-footer">
  <label for="input-2" class="control-label">My Rating:</label>
<input id="stars_{{result.id}}" name="input-2" class="rating rating-loading" data-min="0" data-max="10" data-step="0.1" data-stars="10" data-size="xs"onchange="updateStars('{{result.id}}')" >
</div>
   <form action="{{url_for('delete_f', id=result.id)}}" method="post">
        <input type="hidden" name="_method" value="DELETE">
        <input type="submit" value="Delete" class="btn btn-danger">
      </form>
</div>

JavaScript

    {% for result in results %}
<script type="text/javascript">
    function updateStars(id) {
       var rating = document.getElementById("stars_" + id).value;
       $.ajax({
           url : '/rate_movie',
           headers: {"Content-Type": "application/json"},
           type : 'POST',
           dataType: 'json',
           data : JSON.stringify{'id': 'id', 'rating': rating}
           });
};
</script>
{% endfor %}

Flask 后端

@app.route('/rate_movie',methods=['GET','POST'])
def rate_movie():

    # Create cursor
if request.method == 'POST':

    data = request.get_json(force=True)
    rating = data['rating']
    id = data['id'] 
    cursor = cnx.cursor()
        # Execute
    #cursor.execute("UPDATE favourites SET rating=5  WHERE id =49") ## Works 
    cursor.execute("UPDATE favourites SET rating=%s  WHERE id =%s",(rating,id))
    #("INSERT INTO favourites(rating)VALUES(%s) WHERE id =%s" ,(rating,id))
        # Commit to DB
    cnx.commit()

        #Close connection
    cursor.close()

    flash('Movie Rated', 'success')
return redirect(url_for('my_f'))

【问题讨论】:

    标签: python jquery ajax flask


    【解决方案1】:

    这里有很多问题,但您的第一个大问题是您使用的是非唯一 ID。使您的 ID 独一无二,您可以正确引用隐藏输入的值,修复您的 jQuery 侦听器看起来像 $('#actually_uniqe_id').on('change', function (){...} 而不是目前的混乱,您可以使用 var rating = document.getElementById("#actually_unique_id").value; 正确获取您的值并将您发布的数据修改为像data: {'id': {{result.id}}, 'rating': rating}一样传达id和等级。

    切勿使用非唯一 ID。由于围绕这一点的混乱,您当前的 jQuery 事件侦听器毫无意义,并且您的 rate_id 变量未定义,因为document.getElementById("{{result.id}}") 获取该 id 的第一个引用,这是一个没有属性“值”的 div。

    编辑:此外,由于您有一个循环可能会生成大量评分输入,因此请删除事件侦听器,例如:

    <input id="value_{{result.id}}" type="hidden" onchange="updateStars('{{result.id}}')" />
    

    <script type="text/javascript">
        function updateStars(id) {
           var rating = document.getElementById("value_" + id).value;
           $.ajax({
               url : '/dashboard',
               type : 'POST',
               data : {'id': '{{result.id}}', 'rating': rating}
           });
    </script>
    

    【讨论】:

    • by 'actually unique' 我可以将当​​前的 div 更改为任何唯一的,还是 div 的每个实例都必须是唯一的?
    • @BobSingh 每个 id,无论是 div 还是输入,都必须是唯一的。你不能有 '' 这也是一个问题。一个类可以共享,但 id 必须是唯一的,否则你会遇到很多问题,就像你现在遇到的那样,getElementById 不会返回预期的节点。跨度>
    • 按照您的方式,循环中的每个结果都有不同的 result.id,但在每次迭代中将其作为 HTML id 重用是一个大问题。您可以通过简单地将两个输入 id 更改为 id="stars_{{result.id}}" 和 id="value_{{result.id}}" 来添加一些变化。此外,由于您有一个比事件侦听器更好的循环,因此将 onclick= "updateStars({{result.id}})" 添加到每个输入并创建一个 updateStars() 函数来处理它。我已经编辑了我的答案以澄清。
    • 我非常感谢您提供的所有帮助,并在上面进行了更改以反映您的意见。我仍在努力将用户评价的输入保存到后端。
    • 你能发布一些错误吗?当您尝试先单击添加评分时,请检查浏览器 JS 控制台,并在此处发布任何错误输出。您也可以尝试在几个地方为不同的变量添加一些 console.log() 。如果 JS 控制台看起来不错,请尝试烧瓶错误日志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多