我需要从模板调用方法。我有以下代码:
models.py
class Operation(Base):
...
hash_code = models.UUIDField(default=uuid4)
...
def open_operation(self, user):
...
pass
views.py
class OperationOpenView(APIView):
"""
patch:
"""
filter_backends = (filters.DjangoFilterBackend,)
filter_class = OperationOpenFilter
def patch(self, request, id):
user = request.user
operation = Operation.objects.get(pk=id)
serializer = OperationOpenSerializer(operation,
data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
serializer.instance.open_operation(user)
return Response(data={'operation': operation, 'user': user}, status=status.HTTP_200_OK)
else:
return Response(code=400, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class OperationOpenSerializer(serializers.ModelSerializer):
class Meta:
model = Operation
fields = ('id', )
depth = 1
filters.py
class OperationOpenFilter(filters.FilterSet):
id = filters.NumberFilter(
label='id',
required=True,
help_text='ID'
)
class Meta:
model = Operation
fields = ['id',]
urls.py
path(r'operations/open', views.OperationOpenView.as_view()),
tests.py
@pytest.mark.django_db
def test_view(client_api_logged):
response = client_api_logged.patch('/api/operations/open', kwargs=
{'id': '1'})
assert response.status_code == 200
我无法正常工作,出现了错误:
“位于/ api / operations / open的TypeError patch()缺少1个必需的位置参数:'id'“
隧道尽头的灯是什么?
谢谢大家
答案 0 :(得分:1)
您需要修复您的网址:
path(r'operations/open/<int:id>/', views.OperationOpenView.as_view()),
在tests.py
中:
response = client_api_logged.patch('/api/operations/open/1/', kwargs={'id':1})
patch方法采用3个参数(self,request,id)。 Python(对象引用)提供“自我”,Django提供“请求”,URL需要提供“ id”。帖子中的URL映射不包含“ id”,因此Django抱怨缺少参数。 来自Ben的评论