# Custom user models ## Custom user forms example This example shows how to add a text field and foreign key field to a custom user model and configure Wagtail user forms to allow the fields values to be updated. Create a custom user model. This must at minimum inherit from `AbstractBaseUser` and `PermissionsMixin`. In this case we extend the `AbstractUser` class and add two fields. The foreign key references another model (not shown). ```python from django.contrib.auth.models import AbstractUser class User(AbstractUser): country = models.CharField(verbose_name='country', max_length=255) status = models.ForeignKey(MembershipStatus, on_delete=models.SET_NULL, null=True, default=1) ``` Add the app containing your user model to `INSTALLED_APPS` - it must be above the `'wagtail.users'` line, in order to override Wagtail's built-in templates - and set [AUTH_USER_MODEL](https://docs.djangoproject.com/en/stable/topics/auth/customizing/#substituting-a-custom-user-model) to reference your model. In this example the app is called `users` and the model is `User` ```python AUTH_USER_MODEL = 'users.User' ``` Create your custom user 'create' and 'edit' forms in your app: ```python from django import forms from django.utils.translation import gettext_lazy as _ from wagtail.users.forms import UserEditForm, UserCreationForm from users.models import MembershipStatus class CustomUserEditForm(UserEditForm): country = forms.CharField(required=True, label=_("Country")) status = forms.ModelChoiceField(queryset=MembershipStatus.objects, required=True, label=_("Status")) class CustomUserCreationForm(UserCreationForm): country = forms.CharField(required=True, label=_("Country")) status = forms.ModelChoiceField(queryset=MembershipStatus.objects, required=True, label=_("Status")) ``` Extend the Wagtail user 'create' and 'edit' templates. These extended templates should be placed in a template directory `wagtailusers/users`. Template create.html: ```html+django {% extends "wagtailusers/users/create.html" %} {% block extra_fields %}