Django restframwork Put и DELETE не работают
Get и post работают довольно хорошо для меня. но put и delete я использую "U_repo_name" для поиска в таблице. я получил сообщение об ошибке :
Страница не найдена (404) Метод запроса: PUT URL запроса: http://localhost:8000/gitapi/repo/authoo/ Используя URLconf, определенный в gitit.urls, Django попробовал эти шаблоны URL, в таком порядке:
admin/ gitapi/ [name='gitapi'] gitapi/ repo/ gitapi/ repo/str:U_repo_name
это моя модель :
class UserRepos(models.Model):
U_repo_name =models.CharField( max_length=50)
вот мой url :
urlpatterns = [
path('repo/',view=userreposapi),
path('repo/<str:U_repo_name>',view=userreposapi),
]
это мой сериализатор :
class UserReposSerializer(serializers.ModelSerializer):
class Meta:
model = UserRepos
fields ='__all__'
и это мое мнение :
@csrf_exempt
def userreposapi(request,id=0):
if request.method=='GET':
userrepos = UserRepos.objects.all()
userreposserializer = UserReposSerializer(userrepos , many=True)
return JsonResponse(userreposserializer.data , safe=False)
elif request.method=='POST':
userrepos_data=JSONParser().parse(request)
userreposerializer = UserReposSerializer(data=userrepos_data)
if userreposerializer.is_valid():
userreposerializer.save()
return JsonResponse("added successfully!!",safe=False)
return JsonResponse("failed to add",safe=False)
elif request.method=='Put':
userrepos_data=JSONParser().parse(request)
userrepos = UserRepos.objects.get(U_repo_name=userrepos_data['U_repo_name'])
userreposserializer=UserReposSerializer(userrepos,data=userrepos_data)
if userreposserializer.is_valid():
userreposserializer.save()
return JsonResponse("updated successfully", safe=False)
return JsonResponse("failed to update",safe=False)
elif request.method=='DELETE':
userrepos = UserRepos.objects.all()
userrepos.delete()
return JsonResponse("deleted",safe=False)
Здравствуйте! Я вижу несколько проблем в вашем коде, которые могут вызвать эту проблему.
request.method
всегда полностью пишется заглавными буквами, поэтому в этой строке следует использовать строку'PUT'
вместо'Put'
:elif request.method=='Put':
Вы добавляете косую черту к маршруту при попытке доступа к нему (/gitapi/repo/authoo/), но шаблон, заданный в
urlpatterns
, не имеет этой косой черты:path('repo/<str:U_repo_name>',view=userreposapi),
Вы можете использовать
re_path()
вместоpath()
для задания regex шаблона URL, который работает независимо от того, добавляете вы косую черту или нет:re_path(r'repo/(?P<U_repo_name>\w+)/?', view=userreposapi),
(?P<U_repo_name>\w+)
создает именованную группуU_repo_name
, которая соответствует любому символу слова ([a-zA-Z0-9_]
) от одного до нескольких раз./?
совпадает с одним необязательным символом/
.Ваш маршрут
.'repo/<str:U_repo_name>'
фиксирует строку в переменнойU_repo_name
. Эта переменная предоставляется представлениюuserreposapi()
в качестве аргумента ключевого слова, но представление в настоящее время принимает только каргуid
. Вы должны либо добавить аргументU_repo_name
в качестве необязательного, либо заставить представление принимать другие аргументы ключевых слов с помощью**kwargs
:# Both are valid: def userreposapi(request, id=0, U_repo_name=None): ... def userreposapi(request, id=0, **kwargs): ...
Исправление этих 3 проблем должно заставить маршрут работать.
Думаю, проблема в косой черте в url. Меня там не должно быть.
http://localhost:8000/gitapi/repo/authoo # here I removed the trailing slash.