Проблемы с изменением статуса с ожидающего на отклоненный/одобренный

Хорошо, так что я разработчик 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 и позволить вам обновлять статус записи на прием, нажимая кнопки одобрения или отказа.

Вернуться на верх