为什么post_save信号在这里不起作用?

时间:2019-05-16 05:59:21

标签: python django signals

我创建了一个在创建用户时创建配置文件的信号。以前,相同的代码在其他项目中运行良好。在这里,我不知道我做错了什么,因为它不起作用,也没有为创建的用户创建配置文件。这是信号。

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    print(instance)
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

所有导入均已正确完成,在这里我将其导入了我的应用程序:

class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals

如果要查看轮廓模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return "{} Profile".format(self.user.username)

自从我创建信号以来,对于所有新创建的用户,都应该添加default.jpg作为默认个人资料图片。

但是,如果我创建一个新用户,请登录然后转到个人资料页面,它显示如下内容:

enter image description here

,如果我去管理员并手动添加此个人资料照片,则效果很好。最后一件事,我还在urls.py中添加了以下设置:

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

请帮助我修复它,已经过了3个小时,我尝试了所有可能的方法,但是无法正常工作。谢谢您的帮助。

编辑: template

<div class="media">
    <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
    <div class="media-body">
        <h2 class="account-heading">{{ user.username }}</h2>
        <p class="text-secondary">{{ user.email }}</p>
    </div>
</div>

edit-2:default.jpg已添加到此处! enter image description here

2 个答案:

答案 0 :(得分:1)

如果您没有将src(unknown)附加到用户,则会发生

profile。这很可能意味着您的信号没有被触发,这是因为它们没有被加载,这是因为您的UsersConfig应用程序没有被首先加载。

有2种加载应用的方式。 Proper one将是:

INSTALLED_APPS = [
# ...
'yourapp.apps.UsersConfig'
]

另一种方法是在default_app_config = 'yourapp.apps.UsersConfig'中设置yourapp/__init__.py。请注意,对于新应用程序,它已not recommended

之后,您可能还需要修改signals.py-如果您尝试保存未附加Users的{​​{1}},则会触发异常。

Profile

答案 1 :(得分:0)

Profile模型中添加保存方法:

首先从PIL导入图像

from PIL import Image

然后您的个人资料模型如下:

    class Profile(models.Model):
       user = models.OneToOneField(User, on_delete=models.CASCADE)
       image = models.ImageField(default='default.jpg', upload_to='profile_pics')

       def __str__(self):
         return "{} Profile".format(self.user.username)

       def save(self, *args, **kwargs):
          super().save()

           img = Image.open(self.image.path)

           if img.height > 300 or img.width > 300:
               output_size = (300, 300)
               img.thumbnail(output_size)
               img.save(self.image.path)

此处图像尺寸减小。如果需要,可以使用其他方法,而无需减小尺寸即可直接保存图像。