我完全按照用户pre_save上的信号进行操作。
您的设置看起来不错,因此,如果您将以下代码添加到某个地方(例如core.models.py
,它将在需要时运行):
@receiver(pre_save, sender=User)
def update_username_from_email(sender, instance, **kwargs):
user_email = instance.email
username = user_email[:30]
n = 1
while User.objects.exclude(pk=instance.pk).filter(username=username).exists():
n += 1
username = user_email[:(29 - len(str(n)))] + '-' + str(n)
instance.username = username
我这样做的原因是我希望每次保存用户时都更新用户名。您可以仅在这种情况下检查电子邮件是否已更改,请更新用户名。
然后,我将用户名限制为电子邮件的前30个字符(用户名的默认最大长度为30个字符):
username = user_email[:30]
您也可以更改用户名的最大长度,但是在我的情况下,我更喜欢使用默认长度。
自从我这样做以来,可能会发生重复的用户名。为了避免重复的用户名,如果将生成的用户名限制为30个字符后已经存在,我在末尾放置-2,-3 …以使用户名唯一:
n = 1
while User.objects.exclude(pk=instance.pk).filter(username=username).exists():
n += 1
username = user_email[:(29 - len(str(n)))] + '-' + str(n)
instance.username = username
希望此解决方案对您有所帮助!