Я использую модальный bootstrap для вывода списка экземпляров объектов и выполнения операций CRUD. Я обернул весь список в форму и передал идентификатор каждого отдельного экземпляра объекта в представление, используя имена и значения кнопок, чтобы манипулировать (CRUD) одним экземпляром объекта за раз. Когда я удаляю объект без использования Javascript, представление работает нормально, но как только я добавляю строку e.preventDefault();
, идентификатор выбранного объекта больше не фиксируется в запросе.
почему что?
Более детально шаблон выглядит так:
<form
action="{% url 'delete_habit' %}"
method="POST"
id="deleteForm">{% csrf_token %}
<div class="row">
<div class="col-12 pb-3">
<table class="modal-table border" id="habitsTable">
<tbody>
{% for habit in habits %}
<tr class="border js-row-{{habit.id}}">
<td class="border">
<img src="{% static 'img/bars_icon.svg' %}">
</td>
<td class="text-left border px-3">{{habit.name}}</td>
<td class="border">
<button
id="delete-{{habit.id}}"
type="submit"
value="{{habit.id}}"
name="habit_id"
class="btn">
<img src="{% static 'img/minus_icon.svg' %}">
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
Вид:
def delete_habit(request):
habit_id = request.POST.get('habit_id') --> this fails when e.preventDefault()
data = {'habit_deleted': int(habit_id)}
habit_to_delete = Habit.objects.filter(id=int(habit_id)).filter(
user=request.user)
habit_to_delete.delete()
return JsonResponse(data)
javascript:
var deleteForm = document.getElementById('deleteForm');
if (deleteForm !== null){
deleteForm.addEventListener('submit', function(e){
var formData = new FormData(deleteForm);
e.preventDefault();
var request = new XMLHttpRequest();
request.open(deleteForm.method, deleteForm.action, true);
var cookies = parse_cookies();
request.setRequestHeader('X-CSRFToken', cookies['csrftoken']);
request.onload = function() {
if (this.status >= 200 && this.status < 400) {
var data = JSON.parse(this.response);
removeRow("js-row-" + data.habit_deleted);
};
};
request.send(formData);
});
};
Строка e.preventDefault()
кажется виновной, так как, когда я добавляю эту строку в JS, запрос не возвращает идентификатор выбранной привычки.