""" This module allows importing AbstractBaseUser even when django.contrib.auth is not in INSTALLED_APPS. 这个模块允许导入AbstractBaseUser,即使在django.contrib中也是如此。身份验证是 INSTALLED_APPS。 """ import unicodedata
from django.contrib.auth import password_validation from django.contrib.auth.hashers import ( check_password, is_password_usable, make_password, ) from django.db import models from django.utils.crypto import get_random_string, salted_hmac from django.utils.translation import gettext_lazy as _
classBaseUserManager(models.Manager):
@classmethod defnormalize_email(cls, email): """ Normalize the email address by lowercasing the domain part of it. 将电子邮件地址正常化,将其域部分小写。 """ email = email or'' try: email_name, domain_part = email.strip().rsplit('@', 1) except ValueError: pass else: email = email_name + '@' + domain_part.lower() return email
defmake_random_password(self, length=10, allowed_chars='abcdefghjkmnpqrstuvwxyz' 'ABCDEFGHJKLMNPQRSTUVWXYZ' '23456789'): """ Generate a random password with the given length and given allowed_chars. The default value of allowed_chars does not have "I" or "O" or letters and digits that look similar -- just to avoid confusion. 生成具有给定长度和给定值的随机密码allowed_chars。 allowed_chars的默认值没有“I”或“O”或看起来相似的字母和数字——只是为了避免混淆。 """ return get_random_string(length, allowed_chars)
classAbstractBaseUser(models.Model): password = models.CharField(_('password'), max_length=128) #Django把password做过特殊的加密处理。 last_login = models.DateTimeField(_('last login'), blank=True, null=True) #last_login 记录上次的登录时间 is_active = True #是否是活跃用户 默认为True REQUIRED_FIELDS = [] #一个字段名列表,用于当通过createsuperuser管理命令创建一个用户时的提示。 # Stores the raw password if set_password() is called so that it can #如果调用set_password(),则存储原始密码,以便它可以 # be passed to password_changed() after the model is saved. #保存模型后传递给password_changed()。 _password = None
classMeta: abstract = True
defget_username(self): "Return the identifying username for this User" return getattr(self, self.USERNAME_FIELD)
from django.db import models from myauth.models import User classArticle(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE)