Форма Django была отправлена с помощью метода get, хотя был указан метод post

На моей визуализированной html-странице есть такая форма. При нажатии на кнопку Next, форма должна быть отправлена как метод post, будучи направленной на summary в url

<form action="/summary" method="post">
            <input type="hidden" name="csrfmiddlewaretoken" value="iC3L3QCDundSemg1jfZH96w8X83jrsaE3gQmtbb3rFCyNEN9jXdubao0TJ18EKnb">    
            <label for='customerName' class="subTitle">Name</label>
            <br>
            <input type="text" name="customerName" maxlength="100" required id="id_customerName">
            <br>
            
            <br>
            <label for="email" class="subTitle">Email</label>
            <br>
            <input type="email" name="email" required id="id_email">
            <br>
            <br>

            <label for="phone" class="subTitle">Mobile Phone</label>
            <br>
            <input type="tel" name="phone" required id="id_phone">
            <br>
            <br>

            <label for="comment" class="subTitle">Comment</label>
            <br>
            <textarea name="comment" cols="20" rows="10" maxlength="500" required id="id_comment">
</textarea>
            <br>
            <button onclick="location.href='/deliveryFormCheckout'" type="button" class="btn btn-danger btn-lg">Back</button>
            <button onclick="location.href='/summary'" type="submit" class="btn btn-success btn-lg" id="deliveryNextBtn">Next</button>
        </form>

В urls.py, summary затем направляется на Summary класс представления

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', indexPage.as_view()),
    path('dimsumshop', MainShop.as_view(), name = 'mainShop'),
    path('box/<slug:productSlug>', ProductView.as_view(), name = 'viewProduct'),
    path('product/<slug:boxSlug>', BoxView.as_view(), name = 'BoxView'),
    path('changeItemQuantityInBasket', ChangeItemQuantity.as_view()),
    path('isOrderPriceAboveMinimum', MinimumOrderPriceFulfilled.as_view()),
    path('checkout', Checkout.as_view(), name = 'checkout'),    
    path('deliveryFormCheckout', DeliveryFormView.as_view(), name = 'deliveryFormView'),
    path('checkSteamer', CheckoutCheckSteamer.as_view()),
    path('verifyAddress', VerifyAddress.as_view(), name = 'verifyAddress'),
    path('checkoutCustomer', CustomerInfo.as_view(), name = 'customerInfo'),
    path('summary', Summary.as_view(), name = 'summary'),
    re_path(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT})
]

В классе представления Summary у меня есть следующий код

class Summary(View):
    def post(self, request, *args, **kwargs):
        print('post called')
        form = CustomerCheckoutInfoForm(request.POST)
        context = dict()
        return render(request=request, template_name='summary.html', context = context)

Хотя я указал в форме, что метод является post, он был отправлен как get метод в класс Summary. Если я изменю метод с def post на def get, все работает нормально.

В терминале я получаю эту ошибку, показывающую, что форма была отправлена с помощью метода get.

[15/Jan/2022 17:24:01] "GET /favicon.ico HTTP/1.1" 404 3785
Method Not Allowed (GET): /summary
Method Not Allowed: /summary
[15/Jan/2022 17:24:05] "GET /summary HTTP/1.1" 405 0
        

Вам следует удалить атрибут onclick из вашей кнопки

<button type="submit" class="btn btn-success btn-lg" id="deliveryNextBtn">Next</button>

onclick обработчик в вашем случае изменяет текущий URL браузера и препятствует отправке формы.

Когда срабатывает location.href='/summary', браузер пытается отправить HTTP GET на /summary и получает 405, потому что у вас нет обработчика def get в вашем представлении

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