class AbstractUser(AbstractBaseUser, PermissionsMixin):
"""
FOO - Its recommended to SubClass the AbstractUser Class and create own CustomUser Class like so -
class CustomUser(Abstractuser):
additional_user_fields = bio
FOO --- Im directly adding --->> additional_user_fields = bio , in here into the --- class AbstractUser
"""
"""
An abstract base class implementing a fully featured User model with admin-compliant permissions.
Username and password are required. Other fields are optional.
"""
username_validator = UnicodeUsernameValidator()
help_text_str_username = format_html('<div style="color:grey;"> {} <strong><b>{}</b></strong> {}</div>', 'Username is a Required Field. Your UserName for' , 'DigitalCognition', 'can have max - 150 characters. You may use Letters, digits and @/./+/-/_ only.')
username = models.CharField(
_('username'),
max_length=150,
unique=True,
help_text = help_text_str_username,
#help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[username_validator],
error_messages={
'unique': _("A user with that username already exists within the DigitalCognition user database , kindly choose another username."),
},
)
bio = models.TextField(
_('bio'), #FOO_bio
max_length=500, blank=True)
first_name = models.CharField(_('first name'), max_length=30, blank=True)
last_name = models.CharField(_('last name'), max_length=150, blank=True)
email = models.EmailField(_('email address'), blank=True)
is_staff = models.BooleanField(
_('staff status'),
default=False,
help_text=_('Designates whether the user can log into this admin site.'),
)
is_active = models.BooleanField(
_('active'),
default=True,
help_text=_(
'Designates whether this user should be treated as active. '
'Unselect this instead of deleting accounts.'
),
)
date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
objects = UserManager()
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
abstract = True
def clean(self):
super().clean()
self.email = self.__class__.objects.normalize_email(self.email)
def get_full_name(self):
"""
Return the first_name plus the last_name, with a space in between.
"""
full_name = '%s %s' % (self.first_name, self.last_name)
return full_name.strip()
def get_short_name(self):
"""Return the short name for the user."""
return self.first_name
def email_user(self, subject, message, from_email=None, **kwargs):
"""Send an email to this user."""
send_mail(subject, message, from_email, [self.email], **kwargs)
class User(AbstractUser):
"""
Users within the Django authentication system are represented by this
model.
Username and password are required. Other fields are optional.
"""
class Meta(AbstractUser.Meta):
swappable = 'AUTH_USER_MODEL'
# FOO --swappable- https://stackoverflow.com/questions/22025476/what-is-swappable-in-model-meta-for
Some excellent explanations from SO almost 7 years back - asto whats with the Django -
My current challenge is slightly diff , am trying to understand the flow of information - so to say .
Have posted two more questions on SO , have accepted one of the answers which led me to further learn the concepts / things mentioned below -
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
#bio = self.cleaned_data.get("bio") # Wont work
#print(bio) #prints None - as there is no BIO key within DICT - cleaned_data
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
return password2
https://stackoverflow.com/questions/58770395/django-usermanagerbaseusermanager-question-why-wont-the-email-and-userna