text: 
  from django import forms
  from django.contrib.auth import get_user_model, authenticate, login
  from django.contrib.auth.forms import ReadOnlyPasswordHashField
  
  
  User = get_user_model()
  
  
  class UserAdminCreationForm(forms.ModelForm):
      """A form for creating new users. Includes all the required
      fields, plus a repeated password."""
      password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
      password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
  
      class Meta:
          model = User
          fields = ['email', 'is_admin', 'first_name', 'last_name',
                    'is_researcher', 'is_student', 'is_active', 'is_confirmed', ]
  
      def clean_password2(self):
          # Check that the two password entries match
          password1 = self.cleaned_data.get("password1")
          password2 = self.cleaned_data.get("password2")
          if password1 and password2 and password1 != password2:
              raise forms.ValidationError("Passwords don't match")
          return password2
  
      def save(self, commit=True):
          # Save the provided password in hashed format
          user = super(UserAdminCreationForm, self).save(commit=False)
          user.set_password(self.cleaned_data["password1"])
          if commit:
              user.save()
          return user
  
  
  class UserAdminChangeForm(forms.ModelForm):
      """A form for updating users. Includes all the fields on
      the user, but replaces the password field with admin's
      password hash display field.
      """
      password = ReadOnlyPasswordHashField()
  
      class Meta:
          model = User
          fields = (
              'email', 'first_name', 'last_name', 'password', 'is_admin',
              'is_researcher', 'is_student', 'is_active', 'is_confirmed',)
  
      def clean_password(self):
          # Regardless of what the user provides, return the initial value.
          # This is done here, rather than on the field, because the
          # field does not have access to the initial value
          return self.initial["password"]
  
  
  class LoginForm(forms.Form):
      email = forms.EmailField()
      password = forms.CharField(widget=forms.PasswordInput)
  
      def __init__(self, request, *args, **kwargs):
          self.request = request
          super(LoginForm, self).__init__(*args, **kwargs)
  
      def clean(self):
          data = self.cleaned_data
          email = data.get('email')
          password = data.get('password')
          print("{}, {}".format(email, password))
  
          user = authenticate(self.request, email=email, password=password)
          print(user)
          if user is None:
              raise forms.ValidationError('Invalid Credentials')
          login(self.request, user)
          return data
  