简体   繁体   English

Django Rest Framework 数据表删除

[英]Django Rest Framework Datatables DELETE

Issue问题

I would like to send a list of ID's to the Django Rest Framework API url (which is the rest_framework routers default).我想将 ID 列表发送到 Django Rest Framework API url(这是 rest_framework 路由器的默认值)。 So far everything is working up to the point of sending the ID's.到目前为止,一切都在发送 ID 之前。 When I click the delete button the DELETE call goes to 127.0.0.1:8000/api/entries/_id_/ and does not add the proper ID's that are selected for deletion.当我单击删除按钮时,DELETE 调用转到127.0.0.1:8000/api/entries/_id_/并且没有添加选择删除的正确 ID。

Error Message From Server来自服务器的错误消息

I'm sure this was more or less obvious:我相信这或多或少是显而易见的:

{detail: "Not found."}
detail: "Not found."

entry_list.html entry_list.html

{% extends "dashboard/base.html" %}
{% load i18n %}
{% block content %}

<style>


table.dataTable tbody tr.odd.selected {
 background-color:#acbad4
}

table.dataTable tbody tr.even.selected {
 background-color:#acbad5
}


</style>

<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
    <h2 class="text-gray-800">{% block title %}{% trans "Imported Entries" %}{% endblock %}</h2>
    <a role="button" class="btn btn-success" href="{% url 'import' %}"><i
            class="fas fa-plus-circle"></i> Import New Entires</a>
</div>

<button id="countbutton">Count rows</button>
<button id="deletebutton">Delete rows</button>

<!-- Content Row -->
<div class="row">
    <div class="col-md-12">
        <table id="entrytable"
               class="table-hover table display table-bordered"
               align="center"
               style="width:100%">
            <thead>
            <tr role="row">
                <th>id</th>
                <th>date</th>
                <th>amount</th>
                <th>price</th>
                <th>fee</th>
                <th>entry_type</th>
                <th>reg_fee</th>
                <th>transaction_id</th>
                <th>trade</th>
                <th>symbol</th>
                <!--                <th>created_by</th>-->
            </tr>
            </thead>

        </table>
    </div>
</div>

{% endblock %}


{% block js %}

<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.css"/>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.22/css/dataTables.bootstrap4.min.css"/>


<!--https://datatables.net/examples/server_side/select_rows.html-->
<!--<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.min.css"/>-->

<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.10.22/js/dataTables.bootstrap4.min.js"></script>


<script>

$(document).ready(function() {

//    var selected = [];

    var table = $('#entrytable').DataTable({
        "order": [[ 0, "desc" ]],
        "processing": true,
        "ajax": "/api/entries/?format=datatables",
        "columns": [
            {
                "data": "id",
                "render": function ( data, type, row, meta ) {
                    return '<a type="button" class="" target="_blank" href="' + data + '">' + data + ' </a>';
                }
            },
            {"data": "date"},
            {"data": "amount"},
            {"data": "price"},
            {"data": "fee"},
            {"data": "entry_type"},
            {"data": "reg_fee"},
            {"data": "transaction_id"},
            {
                "data": "trade",
                "render": function ( data, type, row, meta ) {
                    if (data) {
                      return '<a type="button" target="_blank" class="" href="/trade/' + data + '"> ' + data + ' </a>';
                    } else {
                      // show nothing
                    }
                },
                "defaultContent": "",
            },
            {
                "data": "symbol",
                "defaultContent": "",
            },
           // {"data": "created_by"},
            ],


    });

    $('#entrytable tbody').on( 'click', 'tr', function () {
        $(this).toggleClass('selected');
    } );

    $('#countbutton').click( function () {
        alert( table.rows('.selected').data().length +' row(s) selected' );
    } );


    $('#deletebutton').click( function () {
        var selectedRows = table.rows({"selected": true});

        var dataObj = {
            // parse selectedRows to get object ids
            table.rows({"selected":true}).data().pluck('ID');
        }

        $.ajax({
            "url": '/api/entries/_id_/',
            "type": 'DELETE',
            "beforeSend": function(xhr) {
                xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token|escapejs }}");
            },
            "contentType": 'application/json',
            "data": dataObj,
            "success": function (data, status, xhr) {
                // remove the selected rows from the view
                table.row('.selected').remove().draw( false );
            }
        })
    } );


} );



</script>

{% endblock %}

You need to start to break down the logic to figure out what is not working.您需要开始分解逻辑以找出不起作用的地方。

  1. Look in the browser console ('network') tab to see what the DELETE request is being sent as.查看浏览器控制台(“网络”)选项卡以查看发送的 DELETE 请求。 Is it being sent in the format you expect?它是否以您期望的格式发送?

  2. Make the DELETE call on its own.自行进行 DELETE 调用。 You can use curl, Postman, or (even better) a Django Rest Framework test etc to isolate just the API call on its own.您可以使用 curl、Postman 或(甚至更好) Django Rest Framework 测试等来单独隔离 API 调用。 Ensure this deletes the rows as expected.确保这会按预期删除行。 If you have a debugger running on the back-end, this will really speed up finding any issues.如果您在后端运行调试器,这将真正加快发现任何问题的速度。 Once this is working you can debug the frontend.一旦这工作正常,您就可以调试前端。

Since you imply that the ids are not being added to the ajax request, you can use the browser developer tools Javascript debugger to set a breakpoint in the deletebutton click logic.由于您暗示未将 id 添加到 ajax 请求中,因此您可以使用浏览器开发人员工具 Javascript 调试器在deletebutton按钮单击逻辑中设置断点。 Step through this and you should be able to isolate the source of the problem.逐步完成此操作,您应该能够隔离问题的根源。

Also, just a thought, but you call pluck('ID') - should this be pluck('id') ?另外,只是一个想法,但是您调用pluck('ID') - 这应该是pluck('id')吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM