Django post_save()用于注册新用户的信号

Django post_save()用于注册新用户的信号,django,django-views,Django,Django Views,下面是基于createprofileview类的视图,用于注册新用户并同时创建该用户的配置文件 class CreateProfileView(CreateView): model = Profile def post(self, request): user_form = UserForm(request.POST) profile_form = ProfileForm(request.POST, request.FILES) if user_form.is_val

下面是基于createprofileview类的视图,用于注册新用户并同时创建该用户的配置文件

class CreateProfileView(CreateView):
model = Profile

 def post(self, request):
    user_form = UserForm(request.POST)
    profile_form = ProfileForm(request.POST, request.FILES)
    if user_form.is_valid() and profile_form.is_valid(): 
        user_form.save()
        return HttpResponseRedirect(reverse('home', args=[]))
        messages.warning(request, 'Something went wrong in Venter, please try again')

 def get(self, request):
    user_form = UserForm()
    profile_form = ProfileForm()
    return render(request, './mysite/registration.html', {'user_form': user_form, 'profile_form': profile_form})
我在配置文件模型中使用了post_save()信号,如下所示:

class Profile(models.Model):
  user = models.OneToOneField(
    User, 
    on_delete=models.CASCADE,
    primary_key = True
  )
  organisation_name = models.ForeignKey(
    Organisation,
    on_delete= models.CASCADE,
    null=True,
  )
  profile_picture = models.ImageField(
    upload_to='Organisation/Employee Profile Picture/%Y/%m/%d/', 
    null=True,
    blank=True,
  )
  phone_number = models.CharField(
    blank=True, 
    max_length=10
  )
def __str__(self):
    return self.user.username 

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

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
  instance.profile.save()
但是,用户会被创建和保存,但其配置文件详细信息不会被保存。 我不确定如何调整信号功能,以适应我注册新用户的要求,同时创建他们的个人资料

class CreateProfileView(CreateView):
model = Profile

 def post(self, request):
    user_form = UserForm(request.POST)
    profile_form = ProfileForm(request.POST, request.FILES)
    if user_form.is_valid() and profile_form.is_valid(): 
        user_form.save()
        return HttpResponseRedirect(reverse('home', args=[]))
        messages.warning(request, 'Something went wrong in Venter, please try again')

 def get(self, request):
    user_form = UserForm()
    profile_form = ProfileForm()
    return render(request, './mysite/registration.html', {'user_form': user_form, 'profile_form': profile_form})
以下是forms.py:

  class UserForm(forms.ModelForm):
     class Meta:
       model = User
       fields = ('username', 'password', 'email', 'first_name', 'last_name')

  class ProfileForm(forms.ModelForm):
     class Meta:
      model = Profile
      fields = ('organisation_name', 'phone_number', 'profile_picture')

我不认为有概要文件创建信号有什么意义,因为您已经有了一个
ProfileForm
来获取概要文件数据。我认为你可以去掉轮廓信号,更新视图,直接保存轮廓表单。像这样:

if user_form.is_valid() and profile_form.is_valid():
     user = user_form.save()
     profile = profile_form.save(commit=False)
     profile.user = user
     profile.save()

     # rest of the code
更新 根据评论

您需要在用户对象中设置密码。您可以在表单的
save
方法中这样做(使用方法):


用户创建后是否触发了信号?我不这么认为,因为每个新用户的配置文件仍然为空。配置文件详细信息现在已保存,但我的用户无法使用其用户名和密码登录网站,当我检查数据库时,密码已打开,它们不是sha-1密钥加密的。@Simran由于您没有共享任何与用户表单相关的代码,因此很难提供准确的解决方案。但我在回答中分享了一种方法,你可以这样做。请检查一下。