Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么后置保存信号在这里不起作用?_Python_Django_Signals - Fatal编程技术网

Python 为什么后置保存信号在这里不起作用?

Python 为什么后置保存信号在这里不起作用?,python,django,signals,Python,Django,Signals,我创建了一个信号,在创建用户时创建配置文件。以前,相同的代码在其他项目中运行良好。在这里,我不知道我做错了什么,它不工作,也不为创建的用户创建配置文件。这是信号 @receiver(post_save, sender=User) def create_profile(sender, instance, created, **kwargs): print(instance) if created: Profile.objects.create(user=instan

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

@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
作为默认配置文件图片

但如果我创建了一个新用户,登录后进入配置文件页面,它会显示如下内容:

如果我去管理员和手动添加此配置文件图片,它可以正常工作。最后一件事是我在
url.py
中添加了以下设置:

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)
请帮我修好它,已经三个小时了,我尝试了所有可能的方法,但都没能成功。谢谢你的帮助

编辑:
模板

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

{{user.username}

{{user.email}

编辑-2:
默认值。此处添加了jpg

在配置文件中添加保存方法型号:

第一次从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)
此处图像大小减小。如果需要,您可以使用其他方式,您可以直接保存图像而不减小大小。

src(未知)
如果您没有附加到用户的
配置文件
。这很可能意味着你的信号没有被触发,这是因为它们没有被加载,这是因为你的
UsersConfig
应用程序没有首先加载

有两种加载应用程序的方法。将是:

已安装的应用程序=[
# ...
'yourapp.apps.UsersConfig'
]
另一种方法是在
yourapp/\uuuuu init\uuuuu.py
中设置
default\u app\u config='yourapp.apps.UsersConfig'
。请注意,它不再适用于新的应用程序

之后,您可能还需要修改
signals.py
——如果您试图保存未附加
配置文件的
用户
,则会触发异常

@receiver(保存后,发送方=用户)
def create_配置文件(发送方、实例、已创建、**kwargs):
如果创建:
Profile.objects.create(用户=实例)
@接收方(保存后,发送方=用户)
def save_配置文件(发送方、实例,**kwargs):
如果hasattr(实例“profile”):
instance.profile.save()
其他:
Profile.objects.create(用户=实例)

是的,我们正在覆盖它以减小图像的大小。我甚至做了,但没有工作。仍然获取图像的
src(未知)
您是否在settings.py文件中添加了MEDIA\u ROOT=os.path.join(BASE\u DIR,'MEDIA')和MEDIA\u URL='/MEDIA/'是的,我添加了。这里:MEDIA\u URL='/MEDIA/'MEDIA\u ROOT=os.path.join(BASE\u DIR,'MEDIA')是的,请查看更新的问题。我添加了默认位置。是否为每个新的
用户创建jpgDoes
配置文件
(即加载信号)?您可以共享一个呈现
src
属性的模板吗?默认的.jpg路径是否正确?只需检查项目中的图像url和图像路径。我怀疑这是不同的,这就是为什么你没有得到src的原因。@Gasanov我刚刚更新了问题添加模板therein@BidhanMajhi是的,问题更新了谢谢你,兄弟,你救了我。我以“用户”的身份在已安装的应用程序中添加了应用程序,很奇怪,它没有运行,但按照您所说的方式运行。