Django Rest Framework Datatables DELETE
Problema
Me gustaría enviar una lista de ID a la URL de la API de Django Rest Framework (que es la predeterminada de los routers rest_framework). Hasta ahora todo está funcionando hasta el punto de enviar las identificaciones. Cuando hago clic en el botón Eliminar, la llamada DELETE va 127.0.0.1:8000/api/entries/_id_/y no agrega los ID adecuados que se seleccionaron para eliminar.
Mensaje de error del servidor
Estoy seguro de que esto fue más o menos obvio:
{detail: "Not found."}
detail: "Not found."
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 %}
Respuestas
Debe comenzar a romper la lógica para descubrir qué no funciona.
Mire en la pestaña de la consola del navegador ('red') para ver cómo se envía la solicitud DELETE. ¿Se envía en el formato que espera?
Realice la llamada DELETE por sí solo. Puede usar curl, Postman o (incluso mejor) una prueba de Django Rest Framework, etc. para aislar solo la llamada API por sí sola. Asegúrese de que esto elimine las filas como se esperaba. Si tiene un depurador ejecutándose en el back-end, esto realmente acelerará la búsqueda de problemas. Una vez que esto esté funcionando, puede depurar la interfaz.
Dado que implica que los identificadores no se agregan a la solicitud ajax, puede usar el depurador de JavaScript de las herramientas de desarrollo del navegador para establecer un punto de interrupción en la deletebuttonlógica de clic. Siga este paso y debería poder aislar la fuente del problema.
Además, solo un pensamiento, pero llama pluck('ID'), ¿debería ser esto pluck('id')?