基于 Class 的视图的函数视图

Function views to Class based-views

如何将这些视图更改为 Class 基于视图,我一直想知道如何执行此操作:c

我知道 Class 基于视图比功能视图更好,但我不知道有什么区别,我怎样才能将 FW 更改为 CBV 并执行相同的操作。

def login(request):
    context = RequestContext(request, {
        'request': request, 'user': request.user
        })
    return render(request, 'login.html')

@login_required(login_url='/')
def home(request):
    return render_to_response('home.html')

def logout(request):
    auth_logout(request)
    return redirect('/')

如果有人能帮助我,我将不胜感激:)

编辑

现在有针对这两件事的内置 class 视图,例如 LoginView https://docs.djangoproject.com/en/1.11/topics/auth/default/#django.contrib.auth.views.LoginView so is much more easy to do this with CBV and LogoutView https://docs.djangoproject.com/en/1.11/topics/auth/default/#django.contrib.auth.views.LogoutView

如果您想实施或更改它,您应该查看文档对此非常有帮助。

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic.base import TemplateView, View

class LoginTemplateView(TemplateView):
    template_name = 'login.html'

class HomeTemplateView(TemplateView):
    template_name = 'home.html'

    @method_decorator(login_required(login_url='/'))
    def dispatch(self, request, *args, **kwargs):
        return super(HomeTemplateView, self).dispatch(request, *args, **kwargs)

class LogoutView(View):
    def get(self, request, *args, **kwargs):
        auth_logout(request)
        return redirect('/')

我没有测试过,但我认为是这样。 TemplateView 将请求数据传递给模板,因此我们不必再次声明。如果您需要传递更多数据,您可以覆盖 get_context_data 方法。在此页面中向您展示 CBV 中的所有方法和 request/response 的流程。 https://ccbv.co.uk/projects/Django/1.8/django.views.generic.base/TemplateView/