text: from django import forms
  from django.contrib.auth import get_user_model
  from django.contrib.auth.forms import ReadOnlyPasswordHashField
  from django.core.exceptions import ValidationError
  
  User = get_user_model()
  
  
  class UserCreationForm(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",)
          error_messages = {"email": {"unique": "This email has already been taken."}}
  
      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 ValidationError("Passwords don't match")
          return password2
  
      def save(self, commit=True):
          # Save the provided password in hashed format
          user = super().save(commit=False)
          user.set_password(self.cleaned_data["password1"])
          if commit:
              user.save()
          return user
  
  
  class UserChangeForm(forms.ModelForm):
      """A form for updating users. Includes all the fields on
      the user, but replaces the password field with admin's
      disabled password hash display field.
      """
  
      password = ReadOnlyPasswordHashField(
          label=("Password"),
          help_text=(
              "Raw passwords are not stored, so there is no way to see "
              "this user's password, but you can change the password "
              'using <a href="../password/">this form</a>.'
          ),
      )
  
      class Meta:
          model = User
          fields = ("email", "password", "is_active", "is_admin")
  