Проблемы с изменением статуса с ожидающего на отклоненный/одобренный
Хорошо, так что я разработчик django, но также я новичок. Я не очень хорошо разбираюсь в js, но я пытался отправить данные нажатием на кнопку. Проект заключается в утверждении или отклонении заказов в панели владельца магазина В админке django все работает хорошо, и я могу изменить это через интерфейс администратора, но я также хочу, чтобы это было удобно для пользователя, чтобы владелец магазина мог одобрить заявку, нажав на кнопку одобрить, и отклонить ее, нажав на кнопку отмены. В заключение я хочу сделать логику, при которой всякий раз, когда владелец нажимает на кнопку одобрить, заявка в базе данных меняется на одобренную, и то же самое для отклоненной
Когда я нажимаю на кнопку (отклонить или одобрить), она выдает мне 405 ошибку
Мой views.py:
def update_appointment_status(request: HttpRequest):
timeslice_id = request.GET.get('timeslice_id') status = request.GET.get('status') timeslice = get_object_or_404(TimeSlice, id=timeslice_id)
if status == 'approve': timeslice.approve()
elif status == 'refuse': timeslice.refuse()
return JsonResponse({'success': True})
Мои js-коды:
$(document).ready(function() {
// Approve button click handler
$('.approve-btn').click(function(event) {
event.preventDefault();
var timesliceId = $(this).data('id');
$.ajax({
url: '/approve/', // Adjust the URL to your specific endpoint
type: 'POST',
data: {
'timeslice_id': timesliceId,
'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()
},
success: function(response) {
alert('Appointment approved.');
location.reload();
},
error: function(xhr, status, error) {
alert('Error: ' + error);
}
});
});
// Refuse button click handler
$('.refuse-btn').click(function(event) {
event.preventDefault();
var timesliceId = $(this).data('id');
$.ajax({
url: '/refuse/', // Adjust the URL to your specific endpoint
type: 'POST',
data: {
'timeslice_id': timesliceId,
'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()
},
success: function(response) {
alert('Appointment refused.');
location.reload();
},
error: function(xhr, status, error) {
alert('Error: ' + error);
}
});
});
});
Мои шаблоны:
{% for slice in time_slices %}
{% if slice.business_line == barber %}
<li>
{{ slice.start_time }} - {{ slice.end_time }}
<p>State: {{ slice.get_appointment_state_display }}</p>
<form method="post" action="">
{% csrf_token %}
<input type="hidden" name="timeslice_id" value="{{ slice.id }}">
<button type="submit" name="approve" class="approve-btn">Approve</button>
<button type="submit" name="refuse" class="refuse-btn">Refuse</button>
</form>
</li>
{% endif %}
{% endfor %}
Я также отправляю данные с помощью скрытого целочисленного поля формы.
Обновите файл views.py: Убедитесь, что ваша функция представления может обрабатывать POST-запросы и правильно настроена для обновления статуса.
from django.http import JsonResponse, HttpRequest
from django.shortcuts import get_object_or_404
from .models import TimeSlice
def update_appointment_status(request: HttpRequest):
if request.method == 'POST':
timeslice_id = request.POST.get('timeslice_id')
action = request.POST.get('action')
timeslice = get_object_or_404(TimeSlice, id=timeslice_id)
if action == 'approve':
timeslice.approve()
elif action == 'refuse':
timeslice.refuse()
return JsonResponse({'success': True})
return JsonResponse({'error': 'Invalid request method'}, status=405)
Обновите urls.py: Сопоставьте URL с функцией просмотра.
from django.urls import path
from .views import update_appointment_status
urlpatterns = [
path('update_status/', update_appointment_status, name='update_appointment_status'),
]
Обновление JavaScript: Убедитесь, что URL-адреса в вашем JavaScript-коде соответствуют шаблону URL-адресов в urls.py.
$(document).ready(function() {
// Approve button click handler
$('.approve-btn').click(function(event) {
event.preventDefault();
var timesliceId = $(this).siblings('input[name="timeslice_id"]').val();
$.ajax({
url: '/update_status/', // Adjust the URL to your specific endpoint
type: 'POST',
data: {
'timeslice_id': timesliceId,
'action': 'approve',
'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()
},
success: function(response) {
alert('Appointment approved.');
location.reload();
},
error: function(xhr, status, error) {
alert('Error: ' + error);
}
});
});
// Refuse button click handler
$('.refuse-btn').click(function(event) {
event.preventDefault();
var timesliceId = $(this).siblings('input[name="timeslice_id"]').val();
$.ajax({
url: '/update_status/', // Adjust the URL to your specific endpoint
type: 'POST',
data: {
'timeslice_id': timesliceId,
'action': 'refuse',
'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()
},
success: function(response) {
alert('Appointment refused.');
location.reload();
},
error: function(xhr, status, error) {
alert('Error: ' + error);
}
});
});
});
Обновление HTML-шаблона: Убедитесь, что шаблон имеет правильную структуру и в него включен токен CSRF.
{% for barber in barbers %}
<li>
<h3>{{ barber.Title }}</h3>
<p>{{ barber.description }}</p>
<ul>
{% for slice in time_slices %}
{% if slice.business_line == barber %}
<li>
{{ slice.start_time }} - {{ slice.end_time }}
<p>State: {{ slice.get_appointment_state_display }}</p>
<form method="post" action="">
{% csrf_token %}
<input type="hidden" name="timeslice_id" value="{{ slice.id }}">
<button type="button" name="approve" class="approve-btn">Approve</button>
<button type="button" name="refuse" class="refuse-btn">Refuse</button>
</form>
</li>
{% endif %}
{% endfor %}
</ul>
</li>
{% endfor %}
Функция просмотра: Функция update_appointment_status теперь обрабатывает POST-запросы для обновления статуса записи на прием. Она проверяет параметр action, чтобы решить, должна ли встреча быть одобрена или отклонена.
URLs: Убедитесь, что URL-адрес update_status правильно связан с функцией просмотра.
JavaScript: AJAX-запросы настроены на отправку нужных данных на URL /update_status/ методом POST и включают CSRF-токен.
HTML-шаблон: Кнопки имеют значение type="button", чтобы предотвратить отправку формы и вместо этого использовать JavaScript AJAX-вызовы.
Эти изменения должны устранить ошибку 405 и позволить вам обновлять статус записи на прием, нажимая кнопки одобрения или отказа.