首页 > 解决方案 > 如何为 django 类视图获取方法提供上下文

问题描述

我有一个基于类的视图,我想为其提供一些上下文,但我不知道如何实现这一点下面是 views.py

class Dashboard(LoginRequiredMixin, View):
    def get(self, request):

        if request.user is not None and len(request.user.payment_set.all()):
            if request.user.is_active and request.user.payment_set.first().active:
                print(eligible_to_review(self.request))
                return render(request, 'main.html')
            else:
                return redirect('home')
        else:
            return redirect('membership')

如何将上下文传递给该视图以便在 html 文件中使用它

标签: djangodjango-views

解决方案


我认为最干净的方法是用 TemplateView 替换 View 的继承——你可以提供一个 get_context_data 方法来做你需要的任何额外的上下文内容。

理想情况下,您不需要提供 get() ,但由于您在那里有一些额外的重定向逻辑,您可能需要在那里。我猜您可能希望qualified_to_review() 在get_context_data 中,因为不清楚为什么要打印它(到哪个终端?)。同样考虑到 LoginRequiredMixin 的使用,您可以确信当您到达 get() 时 request.user 既已设置又处于活动状态 - 因此测试的这些部分是可减少的。


class Dashboard(LoginRequiredMixin, TemplateView):

    template_name="main.html"

    def get_context_data(self, **kwargs):
        context=super().get_context_data(**kwargs)
        context["whatever"]="Some stuff" # This is where you add extra context you need.
        return context

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

        if len(request.user.payment_set.all()): #request.user is definitely set here!
            if request.user.payment_set.first().active: #request.user is also active!
                print(eligible_to_review(self.request))
                return super().def get(request, *args, **kwargs)
            else:
                return redirect('home')
        else:
            return redirect('membership')

推荐阅读