如何从基于自定义函数的视图中调用基于类的通用API视图

时间:2019-08-13 07:36:24

标签: django django-rest-framework django-views django-class-based-views

我在如何在应用程序中调用自己的API时遇到一些问题和疑问。

因此,我有一个可以向其发送数据的API。我想在其他视图中执行的操作是调用此发送的数据,以便可以在模板中对其进行可视化。

首先,我尝试使用视图内部的库请求来调用API。即使可行,我在身份验证方面还是遇到了问题。所以我想我可以从基于自定义函数的视图中调用基于类的API视图。

但是我不知道这是否可行,也不知道这是否值得推荐。我还以为用javascript可能会更好?我不知道。...所以我的问题是双重的:

a)调用API的最佳做法是从自己的应用中查看/获取API数据,以便我可以对其进行操作和可视化

b)如果这是一个好习惯,那么如何从基于自定义函数的视图中调用基于类的通用API视图?

这是我到目前为止正在尝试的:

my generic view

class BuildingGroupRetrieveAPIView(RetrieveAPIView):
    """Retrieve detail view API.

    Display all information on a single BuildingGroup object with a specific ID.

    """

    authentication_classes = [JSONWebTokenAuthentication, SessionAuthentication, BasicAuthentication]
    serializer_class = BuildingGroupSerializer
    queryset = BuildingGroup.objects.all()

我尝试使用它的基于函数的视图:

def visualize_buildings(request, id):
    returned_view = BuildingGroupRetrieveAPIView.as_view()
    return returned_view


my url

    path('data/<int:pk>/', BuildingGroupRetrieveAPIView.as_view(),
         name="detail_buildings_api"),

当我调用基于类的视图时,我得到AttributeError: 'function' object has no attribute 'get'

非常感谢您的帮助!预先感谢!

2 个答案:

答案 0 :(得分:1)

如果要声明CBV的URL,为了方便起见,您可以在其文件内部声明后调用CBV。

views.py

class BuildingGroupRetrieveAPIView(RetrieveAPIView):
    .....


visualize_buildings = BuildingGroupRetrieveAPIView.as_view()

然后在您的URL上使用该名称。

urls.py

from . import views


path('data/<int:pk>/', views.visualize_buildings, name="detail_buildings_api"),

答案 1 :(得分:0)

正确的方法:

from django.url import reverse, resolve

def get_view_func(name_of_your_view):
    return resolve(reverse(name_of_your_view)).func

# if your are in a drf view:
get_view_func()(request._request)

# if you are in normal django view:
get_view_func()(request)