我创建了一个在创建用户时创建配置文件的信号。以前,相同的代码在其他项目中运行良好。在这里,我不知道我做错了什么,因为它不起作用,也没有为创建的用户创建配置文件。这是信号。
@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
作为默认个人资料图片。
但是,如果我创建一个新用户,请登录然后转到个人资料页面,它显示如下内容:
,如果我去管理员并手动添加此个人资料照片,则效果很好。最后一件事,我还在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>
答案 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)
此处图像尺寸减小。如果需要,可以使用其他方法,而无需减小尺寸即可直接保存图像。