Ai embaixo tem um código de exemplo, eu não testei ele, mas é mais ou menos o caminho:
# o decorator
def sample_login_required(func):
"""
Just check if user is logged or authenticate user
"""
def wrap(request,*args,**kwargs):
# se autenticado retorna de cara a view
if request.user.is_authenticated():
return func(request,*args,**kwargs)
# se nao, faz a autenticacao, eu coloco o user e passwd antes para checar
# se eles são algum valor, caso contrario eu nem passo pela validacao e
# retorno o form vazio
user = request.POST.get('username',None)
passwd = request.POST.get('password',None)
if user or passwd:
request.authform = AuthenticationForm(data={'username':user,'password':passwd})
if request.authform.is_valid():
# loga o usuario se o user/pass for valido, trecho baseado na
# view login do django.contrib.auth.views.login
auth_login(request,request.authform.get_user())
return func(request,*args,**kwargs)
else:
# se nem user nem passwd form valores, não passa na autenticacao e
# só passa o form
request.authform = AuthenticationForm()
return func(request,*args,**kwargs)
# a view
@sample_login_required
def index(request):
# sua view aqui
return HttpResponse('hello world')
# o template:
<div id="userbox">
{% if request.user.is_authenticated %}
Olá {{ request.user.get_full_name }}.
{% else %}
{{ request.authform.as_p }}
{% endif %}
</div>
E em todo lugar que depender do usuario estar logado ou não, vc usa
request.user.is_authenticated :). Você pode se basear na view login para entender melhor o que foi feito :)