Skip to main content
 首页 » 编程设计

python之使用自定义用户模型在 Django 的作者字段中自动添加用户名字

2024年11月01日28lidabo

我使用以下代码在 django 中创建了自定义用户模型

class User(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(_('email address'), unique=True) 
    username = models.CharField(_("Username"), max_length=50, unique=True) 
    is_staff = models.BooleanField(default=False) 
    is_active = models.BooleanField(default=True) 
    date_joined = models.DateTimeField(default=timezone.now) 
 
    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username', ] 
 
    objects = CustomUserManager() 
 
    def __str__(self): 
        return self.email 

我还为用户配置文件创建了另一个模型,如下所示。

class UserProfile(models.Model): 
    user = models.OneToOneField(User, verbose_name=_("User"), on_delete=models.CASCADE) 
    first_name = models.CharField(_("First name"), max_length=50) 
    middle_name = models.CharField(_("Middle name"), max_length=50, blank=True, null=True) 
    last_name = models.CharField(_("Last name"), max_length=50) 
    dob = models.DateField(_("D.O.B"), auto_now=False, auto_now_add=False, blank=False, null=False) 
    profile_image = models.ImageField(_("Profile picture"), upload_to='user/profile/', blank=True) 
    webiste_link = models.URLField(_("Websites"), max_length=200, null=True, blank=True) 

最后我为类别创建了另一个模型,如下所示。

class Category(models.Model): 
    author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_( 
        "Author"), on_delete=models.CASCADE, related_name='blog_category') 
    title = models.CharField(_("Title"), max_length=50) 

我想自动保存登录用户的全名而不是用户电子邮件地址。顺便说一下,我使用下面的代码来自动保存登录用户。它有效,但它只保存用户电子邮件地址。但我想要用户全名而不是电子邮件或用户名。

    obj.author = request.user 
    super().save_model(request, obj, form, change) 

请您参考如下方法:

您可以在 UserProfile 模型中定义一个方法来构建这个全名,因为您可能在另一个函数中需要它:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, verbose_name=_("User"), on_delete=models.CASCADE) 
    [...] 
 
    def get_fullname(self): 
        return ' '.join([name for name in [ 
                      self.first_name,  
                      self.middle_name,  
                      self.last_name 
                      ] if name]) 

所以你保持这种方式将用户外键保存在类别中:

obj.author = request.user 

稍后,要在类别实例上调用全名,您可以使用:

# cat = Category.objects.first()  
cat.author.userprofile.get_fullname()