如何在 django-rest-framework 中根据性别设置默认图像?
How do I set default image based on gender in django-rest-framework?
我知道这里有几个类似的问题,但其中 none 似乎解决了我的问题。我正在使用 Django-Rest-Framework。
我在使用信号创建用户的同时创建用户配置文件。
由于我的问题很容易解释,这是我的代码
models.py
from django.contrib.auth.models import AbstractUser
from django.utils.translation import ugettext_lazy as _
from django.db import models
from django.conf import settings
from PIL import Image
GENDER_SELECTION = (
('Male', 'Male'),
('Female', 'Female'),
)
class CustomUser(AbstractUser):
username = models.CharField(max_length=100, blank=True, null=True)
email = models.EmailField(_('email address'), unique=True)
gender = models.CharField(max_length=20, choices=GENDER_SELECTION)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'gender']
def __str__(self):
return self.email
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
profile_pic = models.ImageField(upload_to='profile/', default='default.png', blank=True)
def __str__(self):
return f'{self.user.first_name} Profile'
def save(self, *args, **kwargs):
super(UserProfile, self).save(*args, **kwargs)
uploaded_image = Image.open(self.profile_pic.path)
if uploaded_image.height > 300 or uploaded_image.width > 300:
output_size = (300, 300)
uploaded_image.thumbnail(output_size)
uploaded_image.save(self.profile_pic.path)
这是我试过的
在models.py
# ...
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
if self.profile_pic == 'default.png':
if CustomUser.gender == 'Male':
self.profile_pic = 'user_default_m.png'
return self.profile_pic
else:
self.profile_pic = 'user_default_f.png'
return self.profile_pic
else:
uploaded_image = Image.open(self.profile_pic.path)
if uploaded_image.height > 300 or uploaded_image.width > 300:
output_size = (300, 300)
uploaded_image.thumbnail(output_size)
uploaded_image.save(self.profile_pic.path)
更新 - 根据要求粘贴 signals.py
文件
signals.py
@receiver(post_save, sender=CustomUser)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=CustomUser)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
这是我注意到的一件事,您正在尝试调整上传图片的大小,同时您正在尝试设置默认图片。你也在尝试这样做 post_save.
我假设您允许用户在编辑 his/her 配置文件时上传图像,我推断这是因为您已经覆盖了保存方法。
我会尽量避免将这两个组合在一起。尽管它们与图像操作相关,但本质上它们是不同的操作。
保持 models.py
文件精简并将其恢复为初始代码。
现在,由于您已经在使用信号,您可以在 signals.py
文件中尝试 pre_save
。编辑您的 signals.py
文件并添加以下代码片段
@receiver(pre_save, sender=UserProfile)
def set_profile_image(sender, instance, *args, **kwargs):
# Obtain the gender of the just created user
gender = CustomUser.objects.all().last().gender
# Check for the gender and assign the file
if gender == 'Male' and instance.profile_pic == 'default.png':
instance.profile_pic = 'default_m.png'
elif gender == 'Female' and instance.profile_pic == 'default.png':
instance.profile_pic = 'default_f.png'
这应该有效。
我知道这里有几个类似的问题,但其中 none 似乎解决了我的问题。我正在使用 Django-Rest-Framework。
我在使用信号创建用户的同时创建用户配置文件。
由于我的问题很容易解释,这是我的代码
models.py
from django.contrib.auth.models import AbstractUser
from django.utils.translation import ugettext_lazy as _
from django.db import models
from django.conf import settings
from PIL import Image
GENDER_SELECTION = (
('Male', 'Male'),
('Female', 'Female'),
)
class CustomUser(AbstractUser):
username = models.CharField(max_length=100, blank=True, null=True)
email = models.EmailField(_('email address'), unique=True)
gender = models.CharField(max_length=20, choices=GENDER_SELECTION)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'gender']
def __str__(self):
return self.email
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
profile_pic = models.ImageField(upload_to='profile/', default='default.png', blank=True)
def __str__(self):
return f'{self.user.first_name} Profile'
def save(self, *args, **kwargs):
super(UserProfile, self).save(*args, **kwargs)
uploaded_image = Image.open(self.profile_pic.path)
if uploaded_image.height > 300 or uploaded_image.width > 300:
output_size = (300, 300)
uploaded_image.thumbnail(output_size)
uploaded_image.save(self.profile_pic.path)
这是我试过的
在models.py
# ...
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
if self.profile_pic == 'default.png':
if CustomUser.gender == 'Male':
self.profile_pic = 'user_default_m.png'
return self.profile_pic
else:
self.profile_pic = 'user_default_f.png'
return self.profile_pic
else:
uploaded_image = Image.open(self.profile_pic.path)
if uploaded_image.height > 300 or uploaded_image.width > 300:
output_size = (300, 300)
uploaded_image.thumbnail(output_size)
uploaded_image.save(self.profile_pic.path)
更新 - 根据要求粘贴 signals.py
文件
signals.py
@receiver(post_save, sender=CustomUser)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=CustomUser)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
这是我注意到的一件事,您正在尝试调整上传图片的大小,同时您正在尝试设置默认图片。你也在尝试这样做 post_save.
我假设您允许用户在编辑 his/her 配置文件时上传图像,我推断这是因为您已经覆盖了保存方法。
我会尽量避免将这两个组合在一起。尽管它们与图像操作相关,但本质上它们是不同的操作。
保持 models.py
文件精简并将其恢复为初始代码。
现在,由于您已经在使用信号,您可以在 signals.py
文件中尝试 pre_save
。编辑您的 signals.py
文件并添加以下代码片段
@receiver(pre_save, sender=UserProfile)
def set_profile_image(sender, instance, *args, **kwargs):
# Obtain the gender of the just created user
gender = CustomUser.objects.all().last().gender
# Check for the gender and assign the file
if gender == 'Male' and instance.profile_pic == 'default.png':
instance.profile_pic = 'default_m.png'
elif gender == 'Female' and instance.profile_pic == 'default.png':
instance.profile_pic = 'default_f.png'
这应该有效。