#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"),
]