首页 > 解决方案 > 如何解决正在创建的社交媒体应用程序中显示电子邮件而不是全名的用户帖子名称?

问题描述

我目前正在使用 Django 开发社交媒体,但在发布模型应用程序方面面临挑战,因为当他们发布图片或写提要帖子而不是他们的全名时,它会显示他们的电子邮件地址!我的用户模型使用电子邮件地址而不是用户名进行身份验证。我不知道这是否是问题的实际过程!我如何在他们的帖子上获得用户的全名?我仍然希望能够使用电子邮件对用户进行身份验证,但他们的帖子应该以他们的全名显示。

Here my user's model 
class AccountManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email,username,last_name, password, **extra_fields):
        values = [email,username]
        field_value_map = dict(zip(self.model.REQUIRED_FIELDS, values))
        for field_name, value in field_value_map.items():
            if not value:
                raise ValueError('The {} value must be set'.format(field_name))

        email = self.normalize_email(email)
        user = self.model(
            email=email,
            username=username,
            **extra_fields
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, username, first_name,last_name, phone_number, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email,username, first_name,last_name, phone_number, password, **extra_fields)

    def create_superuser(self, email, username,phone_number, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email,username,phone_number, password, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=150)
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    phone_number = models.CharField(max_length=50)
    date_of_birth = models.DateField(blank=True, null=True)
    cover_image = models.ImageField(default="default", upload_to="cover_images",blank=True, null=True)
    profile_pic = models.ImageField(default="default.png",blank=True,null=True)
    bio = models.TextField(blank=True, max_length=120)
    country = models.CharField(max_length=120)
    city = models.CharField(max_length=120)
    hide_email= models.BooleanField(default=True)
    SEX_CHOICES = (
        ('F', 'Female',),
        ('M', 'Male',),
        ('U', 'Unsure',),
    )
    gender = models.CharField(
        max_length=1,
        choices=SEX_CHOICES,
    
    )


    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)
    last_login = models.DateTimeField(null=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username','phone_number']
    
    def get_profile_image_filename(self):
        return str(self.profile_image)[str(self.profile_image).index('profile_images/' + str(self.pk) + "/"):]

    def get_full_name(self):
        full_name = "%s %s" % (self.first_name, self.last_name)
        return full_name

    def get_short_name(self):
        return self.username.split()[0]


@receiver(post_save, sender=User)
def user_save(sender, instance, **kwargs):
    FriendList.objects.get_or_create(user=insta
here is my Post model

class Post(models.Model):
    description = models.TextField(max_length=5000, blank=True)
    pic = models.ImageField(upload_to='path/to/img' ,blank=True)
    date_posted = models.DateTimeField(auto_now_add=True)
    user_name = models.ForeignKey(User, on_delete=models.CASCADE)
    tags = models.CharField(max_length=100, blank=True)
    

    @property
    def pic_url(self):
        if self.pic and hasattr(self.pic, 'url'):
            return self.pic.url

    

    def __str__(self):
        return self.description

    def get_absolute_url(self):
        return reverse('feed', kwargs={'pk': self.pk})

    def get_date_posted(self):
        time = datetime.now()
        if self.date_posted.minute == time.minute:
            return str(time.minute - self.date_posted.minute) + " mins ago"
        else:
            if self.date_posted.day == time.day:
                return str(time.hour - self.date_posted.hour) + " hrs"
            else:
                if self.date_posted.month == time.month:
                    return str(time.day - self.date_posted.day) + "d"
                else:
                    if self.date_posted.year == time.year:
                        return str(time.month - self.date_posted.month) + " months ago"
        return self.date_posted
 

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    username = models.ForeignKey(User, related_name='comments', on_delete=models.CASCADE)
    body = models.TextField(max_length=5000)
    comment_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.body

class Like(models.Model):
    user = models.ForeignKey(User, related_name='likes', on_delete=models.CASCADE)
    post = models.ForeignKey(Post, related_name='likes', on_delete=models.CASCADE)
    like_date  = models.DateTimeField(auto_now=True)

    def get_like_date(self):
        time = datetime.now()
        if self.like_date.day == time.day:
            return str(time.hour - self.like_date.hour) + " hrs ago"
        else:
            if self.date_posted.month == time.month:
                return str(time.day - self.like_date.day) + " days ago"
            else:
                if self.like_date.year == time.year:
                    return str(time.month - self.like_date.month) + " months ago"
        return self.like_date

[![这是得到而不是用户全名的结果][2]][2]

标签: djangodjango-modelsdjango-rest-framework

解决方案


user_name像在模板中 调用关系字段将输出模型__str__方法,因此在 a 的情况下,User它将username默认连接到email此处。
要调用相关模型的任何其他字段,只需像任何其他类属性或方法一样调用它 -user_name.get_full_name这里


推荐阅读