【发布时间】:2022-06-13 12:29:41
【问题描述】:
我有一个自定义的UserModel,其中有一个名为pbc_id 的CharField。我希望将其设置为如下所示:
pbc_id = "PBC-" + str(user.pk)
也就是说,我想在字符串“PBC-”的末尾附加新创建的用户的主键值,然后将该值赋给pbc_id字段。
我已经完成了,但只有当我使用终端创建superuser 时它才有效。但是当我使用 Django 管理界面创建一个普通用户时,它不起作用并且pbc-id 得到空值。
我的User 型号如下:
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=254, null=True, blank=True)
email = models.EmailField(max_length=254, unique=True)
first_name = models.CharField(max_length=254, null=True, blank=True)
last_name = models.CharField(max_length=254, null=True, blank=True)
pbc_id = models.CharField(max_length=254, null=True, blank=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_candidate = models.BooleanField(default=False)
is_voter = models.BooleanField(default=False)
votes = models.IntegerField(default=0)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def get_absolute_url(self):
return "/users/%i/" % (self.pk)
我的UserManager 班级如下:
class UserManager(BaseUserManager):
def _create_user(self, email, password, is_staff, is_superuser, is_candidate, is_voter, **extra_fields):
if not email:
raise ValueError('Users must have an email address')
now = timezone.now()
email = self.normalize_email(email)
user = self.model(
username=email,
email=email,
is_staff=is_staff,
is_active=True,
is_superuser=is_superuser,
is_candidate=is_candidate,
is_voter=is_voter,
last_login=now,
date_joined=now,
**extra_fields
)
user.set_password(password)
user.save(using=self._db)
user.pbc_id = "PBC-" + str(user.pk)
user.save(using=self._db)
return user
def create_user(self, email, password, **extra_fields):
user = self._create_user(email, password, False, False, False, False, **extra_fields)
user.pbc_id = "PBC-" + str(user.pk)
user.save(using=self._db)
return user
def create_superuser(self, email, password, **extra_fields):
user=self._create_user(email, password, True, True, False, False, **extra_fields)
return user
在admins.py,我有UserAdmin下面的a类:
class UserAdmin(BaseUserAdmin):
fieldsets = (
(None, {'fields': ('username', 'email', 'password', 'first_name', 'last_name', 'last_login')}),
('Permissions', {'fields': (
'is_active',
'is_staff',
'is_superuser',
'is_candidate',
'is_voter',
'groups',
'user_permissions',
)}),
)
add_fieldsets = (
(
None,
{
'classes': ('wide',),
'fields': ('email', 'password1', 'password2')
}
),
)
list_display = ('username', 'email', 'first_name', 'last_name', 'pbc_id', 'is_staff', 'is_candidate', 'is_voter', 'last_login')
list_filter = ('is_staff', 'is_candidate', 'is_voter', 'is_superuser', 'is_active', 'groups')
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ('groups', 'user_permissions',)
【问题讨论】:
-
为什么还要将它存储在数据库中?如果你只想展示那你为什么不这样做呢?
-
因为我需要在前端的各种模板中访问它,然后使用
pbc_id字段访问用户。
标签: django django-admin django-users django-custom-user