Django,按钮onclick的ajax

时间:2018-07-10 13:02:23

标签: python ajax django

我在烧瓶中有此代码,它向html发送2个列表,一个只是[1,2,3]之类的数字,另一个是[file1,file2,...]等一些名称

这是创建表格的html,第一个列表的列,第二个列表的列,以及onclick的相应按钮,将向烧瓶发送一个函数,以删除相应的文件:

<div class="row">
        <div>
            <table id="mytables" class="table table-striped" style="float: inherit;">
                <thead>
                <tr>
                    <th>id</th>
                    <th>Name</th>
                    <th>file_size</th>
                </tr>
                </thead>
                <tbody>
                {% for id in ids %}
                <tr href="#">
                    <td>{{id+1}}</td>
                    <td>{{file_name[id]}}</td>
                    <td>
                        <button onclick="delete_f('{{file_name[id]}}')" id="d{{id}}" type="button"
                                class="btn btn-xs btn-primary">Delete
                        </button>


                    </td>
                </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>

这是javascript:

<script>
        function delete_f(name) {
            $.ajax({
                url: '/delete_f',
                data: name,
                contentType: 'application/json;charset=UTF-8',
                type: "POST",
                async: false,
                success: function (response) {
                    document.location.reload(true);
                }
            });
        }
    </script>

 and this is the flask:
@app.route('/delete_f', methods=['POST'])
def delete_f():
    name = request.data
    os.remove('E:/Office/DLP/sourceCode/Flask/newwork/static/files/' + name)
    return "das"

这工作正常,我想在django中实现,我的第一个问题是django不支持以下行:{{file_name [id]}} 第二个问题是,无论我做什么,django都不会接受ajax函数的POST变量,这是views.py中的django代码:

@csrf_exempt
def DeleteJobFile(request):
    if request.method == 'POST':
        fs = FileSystemStorage()
        name = request.POST('FileName')
        print(name)
        fs.remove('E:/Office/DLP/sourceCode/Flask/newwork/static/files/' + name)
    else:
        print('no')
    return render(request, 'JobApp/JobApp.html', {'FileList': FileList})

1 个答案:

答案 0 :(得分:0)

好吧,按照hansTheFranz所说的,我尝试了打印请求。body,因此首先将其字符串化为{“ name”:“ SomeOne”}格式,然后在我的视图函数中对其进行解码,这是我的代码: 这是html:

function DeleteJobFile(name) {
            var obj = {'FileName':name};
            var myJSON = JSON.stringify(obj);
            $.ajax({
                type: 'POST',
                url: 'DeleteJobFile/',

{#                data: name#}
                data:myJSON,
                contentType: 'application/json;charset=UTF-8',
                async: false,
                dataType: 'json',
                success: function (response) {
                    document.location.reload(true);
                    alert("The text has been changed." + name);
                }
            });
        }

这是视图:

def DeleteJobFile(request):
    if request.is_ajax():
        body_unicode = request.body.decode('utf-8')
        body = json.loads(body_unicode)
        name = body['FileName']    
        print(name)
    else:
        print('no')
    return render(request, 'JobApp/JobApp.html', {'FileList': FileList})

如果有更简单的方法,请通知我。 还有一件事是要处理CSRF,我必须在views.py的def func之前添加@csrf_exempt ...,当我在数据中添加csrfmiddlewaretoken时,django将不接受:'{{csrf_token}}' ,我该如何使用? 除了我仍然无法调用file_name.id之外,实际上我想访问myfile列表中的第n个元素,其中n也是view.py对html的输入。