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)

Здравствуйте! Я вижу несколько проблем в вашем коде, которые могут вызвать эту проблему.

  1. request.method всегда полностью пишется заглавными буквами, поэтому в этой строке следует использовать строку 'PUT' вместо 'Put':

    elif request.method=='Put':
    
  2. Вы добавляете косую черту к маршруту при попытке доступа к нему (/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_]) от одного до нескольких раз. /? совпадает с одним необязательным символом /.

  3. Ваш маршрут '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.
Вернуться на верх