Джанго «Метод «СООБЩЕНИЕ» не допускается».

#django

Вопрос:

Когда я тестирую свои конечные точки с помощью Postman, я получаю сообщение Method "POST" not allowed , когда пытаюсь создать новый грузовик с помощью функции createTruck. Я могу удалять, обновлять и получать грузовики из своей базы данных. Также я могу создать новый грузовик в Django Admin.

views.py

 @api_view(['POST'])
def createTruck(request):
    data = request.data
    user = request.user

    truck = Truck.objects.create(
        user=user,
        image=data['image'],
        make=data['make'],
        prototype=data['prototyp'],
        year=data['year'],
        serviceInterval=data['serviceInterval'],
        nextService=data['nextService'],
        seats=data['seats'],
        bedLength=data['bedLength'],
        color=data['color'],
        vin=data['vin'],
        currentMileage=data['currentMileage']
    )
    print("request", request)

    serializer = TruckSerializer(truck, many=False)
    return Response(serializer.data)


@api_view(['DELETE'])
def deleteTruck(request, pk):
    truck = Truck.objects.get(id=pk)
    truck.delete()
    return Response('Truck Deleted!')
 

urls.py

 urlpatterns = [
    path('trucks/', views.getTrucks, name="trucks"),
    path('trucks/<str:pk>/', views.getTruck, name="truck"),
    path('trucks/create/', views.createTruck, name="create-truck"),
    path('trucks/delete/<str:pk>/', views.deleteTruck, name="delete-truck"),
    path('trucks/update/<str:pk>/', views.updateTruck, name="update-truck"),
]
 

Возможно, я неправильно передаю пользователя, но я не уверен.

URL-адрес почтальона:

 http://127.0.0.1:8000/api/trucks/create/
 

Тело-это

 {
        "user": 1,
        "image": "/images/2016-tundra-600x400.jpeg",
        "make": "Toyota",
        "prototype": "Tundra",
        "year": 2016,
        "serviceInterval": 720,
        "nextService": 600,
        "seats": 2,
        "bedLength": "5.50",
        "color": "blak",
        "vin": "0989098ad2321",
        "currentMileage": 20000
    }
 

Комментарии:

1. Какой URL вы использовали для создания грузовика?

2. Использование trucks/create ловится trucks/<str:pk>/ , (то есть оно проходит views.getTruck ), так create как может совпадать <str:pk> . Ваш пк на самом деле является строкой?

3. нет, это номер. должен ли я попробовать int?

4. Да, лучше использовать <int:pk>

5. Спасибо, Брайан, ты был прав, все шло как по маслу. Я больше не получаю сообщение «Сообщение запрещено».

Ответ №1:

Просто измените шаблон своего URL-адреса. Это конфликт шаблонов URL-адресов, с помощью которого шаблон create-truck пытается получить грузовик pk:create . Стандартным решением является изменение типа pk с str на int. Но другое решение состоит в том, чтобы изменить приоритет URL в ваших шаблонах и переместить create-truck на шаг выше.

Рекомендуемое решение:

 urlpatterns = [
    path('trucks/', views.getTrucks, name="trucks"),
    path('trucks/<int:pk>/', views.getTruck, name="truck"),
    path('trucks/create/', views.createTruck, name="create-truck"),
    path('trucks/delete/<str:pk>/', views.deleteTruck, name="delete-truck"),
    path('trucks/update/<str:pk>/', views.updateTruck, name="update-truck"),
]
 

другое решение:

 urlpatterns = [
    path('trucks/', views.getTrucks, name="trucks"),
    path('trucks/create/', views.createTruck, name="create-truck"),
    path('trucks/<str:pk>/', views.getTruck, name="truck"),
    path('trucks/delete/<str:pk>/', views.deleteTruck, name="delete-truck"),
    path('trucks/update/<str:pk>/', views.updateTruck, name="update-truck"),
]