Eu sinto fortemente que a direção em que Django está se movendo está correta. Para aqueles de vocês que ainda não usam visualizações baseadas em classe (CBV), leia sobre elas e comece a usá-las. Eles realmente arrasam.
O problema é que algumas das visualizações integradas ainda são baseadas em funções. Em um esforço para fazer tudo no meu projeto mais recente 100% baseado em CBV, eu reescrevi ligeiramente alguns dos djanago.contrib.auth.views
.
views.py
from django.conf import settings
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.http import HttpResponseRedirect
from django.utils.decorators import method_decorator
from django.views.decorators.debug import sensitive_post_parameters
from django.views import FormView, View
class Login(FormView):
form_class = AuthenticationForm
def form_valid(self, form):
redirect_to = settings.LOGIN_REDIRECT_URL
auth_login(self.request, form.get_user())
if self.request.session.test_cookie_worked():
self.request.session.delete_test_cookie()
return HttpResponseRedirect(redirect_to)
def form_invalid(self, form):
return self.render_to_response(self.get_context_data(form=form))
@method_decorator(sensitive_post_parameters('password'))
def dispatch(self, request, *args, **kwargs):
request.session.set_test_cookie()
return super(Login, self).dispatch(request, *args, **kwargs)
class Logout(View):
def get(self, request, *args, **kwargs):
auth_logout(request)
return HttpResponseRedirect(settings.LOGOUT_REDIRECT_URL)
Agora você pode usar essas visualizações como qualquer outra visualização baseada em classe, por exemplo, Login.as_view()
em seus padrões de url!