django - 如何解决正在创建的社交媒体应用程序中显示电子邮件而不是全名的用户帖子名称?
问题描述
我目前正在使用 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]
解决方案
user_name
像在模板中 调用关系字段将输出模型__str__
方法,因此在 a 的情况下,User
它将username
默认连接到email
此处。
要调用相关模型的任何其他字段,只需像任何其他类属性或方法一样调用它 -user_name.get_full_name
这里
推荐阅读
- laravel - Laravel 包谷歌分析
- javascript - 通过 JQUERY 加载 CSS 过渡
- python - 多处理管理器酸洗失败
- javascript - Typescript 通用函数类型文字
- mysql - SQL AVERAGE 查询 - 从列 city 中查找订单总值的平均值
- python - tf.nn.conv2d 和 keras.layers.Conv2D 的输出不相等
- pandas - 如何在读取 csv 文件时跳过偶数/奇数行?
- ios - SwiftUI 拖动手势跳转
- c - 附加 ADT 列表段错误
- sql-server - SQL Server 中处理 HMAC-SHA256 加密的函数?