I had been struggling with finding the answer to this for a long time till I found this workaround.
In models.py do:
from django.db import models
class YourLoginModel:
fullname = models.CharField(max_length=255, default='your_name', unique=True)
email = models.EmailField(max_length=255, unique=True)
username = models.CharField(max_length=255, unique=True)
password = models.CharField(max_length=255) #using werkzeug's
#generate_password_hash on plaintext password before committing to database model
In forms.py do:
from django import forms
from .models import YourLoginModel
class LoginForm(forms.ModelForm):
class Meta:
model = YourLoginModel
fields = ('username', 'password')
In views.py login logic:
def login(request):
#login logic here
# init empty form
form = LoginForm()
if request.method == 'POST':
try:
# peforms a Select query in db and gets user with log in username
user_logging_in = User.objects.get(username=request.POST['username'])
# assign user hash to var
hash = user_logging_in.password
# assign form str passs word to var
password = request.POST['password']
# if the user does not exist
except ObjectDoesNotExist:
html_response = 'User does not exists'
return HttpResponse(html_response)
# peform password and hash check
if check_password_hash(hash, password):
#using sessions cookies to know who we're interacting with
request.session['username'] = request.POST['username']
#set expiry date of the session
request.session.set_expiry(0) # 0 means when the browser is closed
return redirect('yourapp:home')
else:
return HttpResponse('password was incorrect')
html = 'Login'
return render(request, 'login.html', {'form': form})
In app view you want to perform login_required on do
from django.views.generic import TemplateView
class yourTemplateView(TemplateView):
template_name = 'your_template.html'
def dispatch(self, request, *args, **kwrags):
if not request.session.has_key('username'):
#return HttpResponse('not logged in')
return redirect('yourapp:login.html')
else:
return render(request, 'your_view.html')