基于类的视图的函数视图

时间:2015-05-22 17:39:11

标签: python django django-class-based-views

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

我知道基于类的视图比功能视图更好,但我不知道如何将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('/')

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

修改

现在有一些内置的基于类的视图用于这两个方面,比如LoginView https://docs.djangoproject.com/en/1.11/topics/auth/default/#django.contrib.auth.views.LoginView所以使用CBV和LogoutView https://docs.djangoproject.com/en/1.11/topics/auth/default/#django.contrib.auth.views.LogoutView

更容易做到这一点

如果你想实现或改变它,你应该看看文档对此非常有帮助。

1 个答案:

答案 0 :(得分:1)

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中的所有方法以及请求/响应的流程。 https://ccbv.co.uk/projects/Django/1.8/django.views.generic.base/TemplateView/