【问题标题】:How do I set default image based on gender in django-rest-framework?如何在 django-rest-framework 中根据性别设置默认图像?
【发布时间】:2021-11-14 02:41:24
【问题描述】:

我知道这里有几个类似的问题,但似乎没有一个能解决我的问题。我正在使用 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()

【问题讨论】:

  • 您能否发布您用于创建个人资料的信号代码?
  • @SohailAQ 更新了我的问题。
  • 当前设置有什么问题?
  • @JPG 文件不是根据性别分配的。

标签: django django-models django-rest-framework


【解决方案1】:

这是我注意到的一点,您正在尝试调整上传图片的大小,并且您正在尝试同时设置默认图片。您也正在尝试执行此 post_save。

我假设您允许用户在编辑他/她的个人资料时上传图像,我推断这是因为您覆盖了保存方法。

我会尽量避免与这两者混为一谈。尽管它们与图像操作有关,但本质上它们是不同的操作。

保持您的 models.py 文件精简并将其恢复为您的初始代码。

现在,由于您已经在使用信号,您可以在 signals.py 文件中尝试 pre_save。编辑您的signals.py 文件并添加以下代码 sn-p

@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'

这应该可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多