如何从TemplateView发布到GenericAPIView

时间:2019-05-07 02:46:02

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

我有一个激活用户帐户的API端点。它期望表单数据中有uidtoken

当然,期望用户发布到我的端点是UX缺陷

因此他们会收到一封电子邮件,其中包含用于激活其帐户的链接(包含uidtoken

like:http://example.com/api/auth/account/activate/{uid}/{token}

例如https://example.com/api/auth/account/activate/MzA/562-5bb096a051c6210994fd

因此,当单击该链接的视图时,会将其数据发布到API端点并返回模板页面。我正在执行的实现:

# urls.py
from django.urls import include, path
from . import views

urlpatterns = [
    path('activate/<str:uid>/<str:token>',  views.ActivationView.as_view(), name='activate')
]
# views.py
from django.views.generic.base import TemplateView
from djoser.views import ActivationView as DjoserActivationView
from django.test.client import RequestFactory


class ActivationView(TemplateView):

    template_name = "users/activation.html"

    def dispatch(self, request, *args, **kwargs):
        form_data = {
            'uid': kwargs['uid'],
            'token': kwargs['token']
        }

        alt_request = RequestFactory().post('/api/auth/users/confirm/', form_data)
        activate_view_response = DjoserActivationView.as_view()(alt_request)

        kwargs['activation_status_code'] = activate_view_response.status_code

        return super().dispatch(request, *args, **kwargs)

但是,我认为我不能像在这里那样使用RequestFactory。我不知道有什么其他方法可以实现这一目标。 Django提供哪些选项?

1 个答案:

答案 0 :(得分:0)

似乎ActivationView中的逻辑是作为单个方法_action实现的。因此,您可以将自己的视图设为该视图的子类,然后在get中调用该方法。

class ActivationView(DjoserActivationView):

    template_name = "users/activation.html"

    def get(self, request, **kwargs):
        serializer = self.get_serializer(data=kwargs)
        if serializer.is_valid():
            response = self._action(serializer)
            kwargs['activation_status_code'] = activate_view_response.status_code

        return super().dispatch(request, *args, **kwargs)

注意,我对Djoser并不熟悉,我也不真正理解为什么他们首先希望您将其实现为POST。他们大概有这样做的充分理由,因此您应该仔细考虑是否真的要这样做。