- 作为一个Python小白,公司中老师交给我一个需求,要求修改添加人员方法。之前的字段太多了,根据models中定义的字段来修改。我改了一天没改出来,也没有报错,只是提醒我该用户名已存在,但是数据库中没有这个用户名,第二天我问老师,他跟我讲解我才清楚。
- 由于之前字段和数据库中都包含username和name,而且models文件中定义的数据库表字段只有name没有username,所以我在所有有关于username的地方包括create_user去数据库创建用户时把username都删了。 但是老师告诉我说,User继承了Django自带的类User类,在自带的User类中我们要看username是否被定义,如果没被定义我们要手动给它定义一下:
- 我们注意到在models.User中继承了AbstractUser这个类,我们点进去看
class AbstractUser(AbstractBaseUser, PermissionsMixin):
"""
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()
username = models.CharField(
_("username"),
max_length=150,
unique=True,
help_text=_(
"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
),
validators=[username_validator],
error_messages={
"unique": _("A user with that username already exists."),
},
)
first_name = models.CharField(_("first name"), max_length=150, 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)
- 我们发现username没有被定义,而其他字段已被定义,例如first_name、last_name、email、is_staff…所以我们要在创建数据库语句时定义一下username的值,如下:
- 这样就可以啦!
对于Django的继承我只理解了当下需要的,之后有更多理解会继续记下笔记的!
|