Get和post工作对我来说很好。但是使用"U_repo_name"在表格中查找我得到了错误信息:
页面未找到(404)请求方法:PUT请求URL: http://localhost:8000/gitapi/repo/authoo/使用gitit中定义的url配置。Django尝试了以下URL模式,顺序如下:
管理/gitapi/[name = ' gitapi ']gitapi/回购/gitapi/回购/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),
]
项目url:
urlpatterns = [
path('admin/', admin.site.urls),
path('gitapi/',include('gitapi.urls')),
]
这是我的序列化器:
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/authoro/)),但是在
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
kwarg。您应该添加U_repo_name
kwarg作为可选参数,或者使用**kwargs
使视图接受其他关键字参数:# Both are valid: def userreposapi(request, id=0, U_repo_name=None): ... def userreposapi(request, id=0, **kwargs): ...
修复这三个问题应该可以使路由正常运行。
我认为url中的尾斜杠是问题所在。我不应该在那里。
http://localhost:8000/gitapi/repo/authoo # here I removed the trailing slash.