我的模特如下:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
role = models.CharField(max_length=25,choices=role, default='Freelancer')
def __str__(self):
return f'{self.user.username} Profile'我的看法如下:
def profile(request):
if request.method == 'POST':
p_form = ProfileUpdateForm(request.POST,
request.FILES,
instance=request.user.profile)
if p_form.is_valid():
p_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('profile')
else:
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'p_form': p_form
}
return render(request, 'profile.html', context)我的信号文件如下:
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
profile.save()
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()但是,当我尝试创建一个新用户时,配置文件不会被创建,我在/ profile / user没有配置文件时得到了RelatedObjectDoesNotExist。
我不知道为什么这不管用。我还必须指出,我正在使用Django来验证我的身份。
发布于 2020-01-20 09:46:38
在您是信号中,您已经在使用create,然后无缘无故地再次使用save。
试试这个:
from django.db.models.signals import post_save
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
post_save.connect(create_profile, sender=User)不需要两个信号来从用户保存相同的传入实例,上面的代码将在创建Profile对象时创建一个User对象。
发布于 2020-01-20 10:52:59
我怀疑你的信号没有加载,所以没有呼叫。来自文档
在实践中,信号处理程序通常定义在与其相关的应用程序的信号子模块中。信号接收器连接在应用程序配置类的ready()方法中。如果您使用的是接收器()装饰器,请将信号子模块导入ready()中。
所以在你的apps.py中做这样的事情
#apps.py
class MyappConfig(AppConfig):
name = 'myapp'
def ready(self):
from . import signals其次,确保正在使用AppConfig。因此,在您的settings.py中,在INSTALLED_APPS部件中,这样调用您的应用程序:
# settings.py
INSTALLED_APPS = [
myapp.apps.MyappConfig
# ...
]还有两点意见:
在您发布的代码中,profile.save()应引发异常,因为未定义配置文件。然而,正如@ans2human所指出的,这一声明并不是必需的。
在您的配置文件中,角色的选择与角色的名称相同。这在我看来很奇怪。
https://stackoverflow.com/questions/59820521
复制相似问题