缺少 1 个必需的位置参数:“pk”

Posted

技术标签:

【中文标题】缺少 1 个必需的位置参数:“pk”【英文标题】:missing 1 required positional argument: 'pk' 【发布时间】:2019-11-12 16:03:16 【问题描述】:

我是 Django 的新手并做出反应。上周我已经遇到了这个错误,当时它是请求 URL 错误。昨天我更改了后端设计,现在它的错误再次发生。

这是我的网址=>

urlpatterns = [
    url(r'^allowances_mas/', AllowanceAPIView.as_view()),
    url(r'^allowances_mas/(?P<pk>\d+)/$', AllowanceAPIView.as_view()),....

这是我在视图内部的 put 方法,

def put(self,request,pk):
        save_allowance = get_object_or_404(Allowance.objects.all(),pk=pk)
        data = request.data.get('allowance')
        serializer = AllowanceSerializer(instance=save_allowance,data=data,partial=True)

        if serializer.is_valid():           
            allowance_saved=serializer.save()
            return Response("success":"Allowance '' updated successfully".format(allowance_saved.AllowID))
        else:
            return Response("fail":"''".format(serializer.errors))  

这是来自 React axios 的 url 请求 =>

  axios.put('http://127.0.0.1:8000/api/allowances_mas/1/',  allowance ,
        headers: 
          'Content-Type': 'application/json'
        
      )
        .then(res => 
          axios.get('http://127.0.0.1:8000/api/allowances_mas/')
          .then(res=>
            const resallowance=res.data.allowance;  

            this.setState(
              allowances:resallowance 
            );
          )      
        )
        .catch(err=>
          console.log("error",err);
        )
        .finally(fin=>
          console.log(fin);
        )

我可以使用 get 和 post 方法,但 put 和 delete 不能因为这个错误。我设置了 pk 键,为什么它仍然发生错误?谢谢。

【问题讨论】:

试试这个axios.put('http://127.0.0.1:8000/api/allowances_mas/', allowance @shafik,仍然发生错误。我可以知道你为什么这样建议吗? get 工作正常吗? 这可能会帮助你***.com/questions/47523151/… @shafik,是的,获取和发布工作正常。这两种方法都没有pk参数。 【参考方案1】:

发生错误是因为您在 put 方法中将 pk 作为参数传递。

def put(self,request,pk):

改用这个:

def put(self, request, *args, **kwargs):

如果要从传递的 URL 中获取 pk,请使用:

pk = self.kwargs.get('pk')

所以你的代码应该是这样的:

def put(self,request, *args, **kwargs):
    pk = self.kwargs.get('pk')
    save_allowance = get_object_or_404(Allowance.objects.all(), pk=pk)
    data = request.data.get('allowance')
    serializer = AllowanceSerializer(instance=save_allowance,data=data,partial=True)

    if serializer.is_valid():           
        allowance_saved=serializer.save()
        return Response("success":"Allowance '' updated successfully".format(allowance_saved.AllowID))
    else:
        return Response("fail":"''".format(serializer.errors))  

另外,更改 URL 模式的顺序:

urlpatterns = [
    url(r'^allowances_mas/(?P<pk>\d+)/$', AllowanceAPIView.as_view()),
    url(r'^allowances_mas/', AllowanceAPIView.as_view()), 
]

【讨论】:

所以请求的url还是一样的? 是的,它会保持不变 仍然收到错误但这次更改 404 错误 因为您使用的是get_object_or_404,所以该对象可能不存在? 你能把urlpattern改成这样吗:urlpatterns = [ url(r'^allowances_mas/(?P\d+)/$', AllowanceAPIView.as_view()), url(r' ^allowances_mas/', AllowanceAPIView.as_view()), ] 这样 pk 一个高于另一个

以上是关于缺少 1 个必需的位置参数:“pk”的主要内容,如果未能解决你的问题,请参考以下文章

“fit() 缺少 1 个必需的位置参数:'y'”错误

缺少 1 个必需的位置参数:'queryset'

TypeError:缺少 1 个必需的位置参数:'self'

类型错误:parse() 缺少 1 个必需的位置参数:'stream'

TypeError:AuthMiddlewareStack() 缺少 1 个必需的位置参数:'inner'

类型错误:预测()缺少 1 个必需的位置参数:'params'