为什么信号在错误的时间触发?

why signal triggered in wrong time?

我正在创建一个信号,考虑到他们所在的 group,它会为 user 创建配置文件。 例如,如果他们的用户在 TEACHER 组中,将为它创建 teacher_profile

问题是在用户 group 之前触发的信号已设置,并给我错误 'NoneType' object has no attribute 'name'

#views.py
def register_page(request):
    if request.POST:
        password = request.POST['password']
        repassword = request.POST['repassword']
        username = request.POST['username']
        GROUP = request.POST['group']
        if password == repassword:
            #creating user
            user = User.objects.create(is_superuser=False, username=username)
            user.groups.set([Group.objects.get(name=GROUP), ])
            user.set_password(password)
            user.save()
            
            #authenticating user
            user = authenticate(username=username, password=password)
            if user:
                login(request, user)
                return redirect('/esadra/user/dashboard/')
        else:
            messages.error(request, 'پسورد ها مطابقت ندارند')
#models.py

@receiver(post_save, sender=User)
def user_profile_creator(sender, instance, created, *args, **kwargs):
    if created:
        if instance.groups.first().name == 'TEACHER':
            profile = teacher.objects.create(user=instance)
        elif instance.groups.objects.first().name == 'Student':
            profile = student.objects.create(user=instance)

我已经尝试 m2m_changedset_password 带来了其他问题,它使用户实例成为 None type 因为它应该被保存以触发 m2m_changed 信号。

我们将不胜感激。

您可以尝试在视图中直接完成它

def register_page(request):
    if request.POST:
        password = request.POST['password']
        repassword = request.POST['repassword']
        username = request.POST['username']
        GROUP = request.POST['group']
        if password == repassword:
            #creating user
            group = Group.objects.get(name=GROUP)
            user = User.objects.create(is_superuser=False, username=username)
            user.groups.set([group, ])
            user.set_password(password)
            user.save()
            if group.name == 'TEACHER':
                teacher.objects.create(user=user)
            elif group.name == 'Student':
                student.objects.create(user=user)
            
            #authenticating user
            user = authenticate(username=username, password=password)
            if user:
                login(request, user)
                return redirect('/esadra/user/dashboard/')
        else:
            messages.error(request, 'پسورد ها مطابقت ندارند')

此外,如果您想使其更具可读性,只需将其提取到单独的函数等中即可。

这对你有用吗?