Django URL并使其中的一部分可选,但使用相同的类API视图

时间:2017-11-30 15:15:33

标签: django django-rest-framework

所以我在后端有这个API URL,我想知道如何让它的一部分可选。

def create_file():
   with open("test.txt", "w") as file:
      file.write("A")
      file.close()

create_file() #call here

因此前端会发生两件事。

1)当用户登录时,它会将它们带到列出所有项目的url(r'^api/documents/(?P<id>[0-9]+)$', GetDocumentsAPIView.as_view(), name='documents'), 。单击项目会使它们/home,其中数字是项目的编号,并列出该项目的所有文档。这会发送到API网址/documents/85。这很好。

2)另一个选项是,用户只需点击/api/documents/85中的Documents链接,即可将其带到navbar。这应该只是转到API网址/documents,最终转到确定最新项目的/api/documents/,并在前端返回并呈现该文档的文档

我无法工作。不知道我是否可以只使用一个serializer.py,或者如果我需要两个url()。希望我发布的那个会将(?P<id>[0-9]+)$视为可选项,如果没有任何内容会返回相同的GetDocumentsAPIView,但事实并非如此。

编辑:包括我此时用于测试的视图。只需print()即可查看是否有任何内容被路由到该视图。

from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class GetDocumentsAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, *args, **kwargs):
        print(kwargs.get('id'))
        return Response('Test')

1 个答案:

答案 0 :(得分:1)

不需要为r'^api/documents/$'添加网址格式,顺便提一下,可以启动相同的视图。只有在视图内部,您才必须假定id是可选的:

if kwargs.get('id'):
    # return specific document
else:
    # return list of documents

我会将您的第一个网址格式重命名为“view_document”,这样您就可以在另一个更通用的视图中使用名称“文档”。

注意:我认为您的网址结构有误。根据REST,读取您的URL时,我希望在获取document时看到id documents/85 85。如果您确实列出了项目的文档,则该网址应为projects/85/documents/或未指定projects/documents