【发布时间】:2021-09-15 12:05:26
【问题描述】:
我正在开发一个 Django 项目,其中有一个自定义 AbstractBaseUser 和一个自定义 BaseUserManager。从逻辑上讲,我很早就创建了这些,并且由于他们正在做他们应该做的事情,所以我继续进行项目。 现在,我想将属性 userTag 添加到自定义用户,并且我想在创建用户时调用函数 generate_userTag(对于超级用户也是如此)。所以我将这个功能添加到我已经“工作”的 create_user 中;至少我认为会的。事实证明,我在 create_user 函数中所做的任何更改都没有被应用或对项目产生任何影响。就像函数永远不会被调用一样。我添加了一个 ValueError ,它应该在每次调用函数时引发,但是当我从测试站点注册新用户时,没有错误,并且在没有 userTag 的情况下创建了用户。
现在奇怪的部分:我测试了创建一个超级用户,令我惊讶的是它可以完美地工作。使用 userTag 创建超级用户。一切都很好。
所以我的问题是:什么可能导致 Django 在创建用户时不调用自定义 create_user,但在创建超级用户时调用自定义 create_superuser?
感谢您的帮助
帐户/models.py
class MyAccountManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError('Users must have an email address')
if not username:
raise ValueError('Users must have a username')
user = self.model(
email=self.normalize_email(email),
username=username,
userTag=generate_userTag(username),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name="email", max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
userTag = models.CharField(max_length=35, default="#00000")
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
profile_image = models.ImageField(max_length=255, upload_to=get_profile_image_filepath, null=True, blank=True, default=get_default_profile_image)
hide_email = models.BooleanField(default=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = MyAccountManager()
def __str__(self):
return self.username
帐户/views.py
def register_view(request, *args, **kwargs):
user = request.user
if user.is_authenticated:
return HttpResponse("You are already authenticated as " + str(user.username))
context = {}
if request.POST:
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
email = form.cleaned_data.get('email').lower()
raw_password = form.cleaned_data.get('password1')
account = authenticate(email=email, password=raw_password)
login(request, account)
destination = kwargs.get("next")
if destination:
return redirect(destination)
return redirect('home')
else:
context['registration_form'] = form
else:
form = RegistrationForm()
context['registration_form'] = form
return render(request, 'account/register.html', context)
settings.py
AUTH_USER_MODEL = 'account.Account'
【问题讨论】:
-
如何使用
./manage.py createsuperuser创建超级用户?以及如何创建用户?你能提供两者的代码/命令吗? -
对于超级用户,我使用 ./manage.py createsuperuser。对于用户,我使用registration_view 函数(在上面添加)。我基本上复制了那部分,所以我不能 100% 确定那里发生了什么。 form.save() 是否创建了新用户?
-
您没有提供导入,所以我不确定您使用的是哪个
RegistrationForm。由于这是 Python,您可以简单地查看它的代码以了解它在做什么。配置良好的 IDE(例如 VisualStudioCode 或 PyCharm)将通过允许您单击参考并打开相应的代码来轻松帮助您。
标签: python django customization