Django post_save()用于注册新用户的信号
下面是基于createprofileview类的视图,用于注册新用户并同时创建该用户的配置文件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
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由于您没有共享任何与用户表单相关的代码,因此很难提供准确的解决方案。但我在回答中分享了一种方法,你可以这样做。请检查一下。