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

Python 为什么信号在错误的时间触发?,python,django,model,django-signals,Python,Django,Model,Django Signals,我正在创建一个信号,为用户创建一个配置文件,考虑到他们所在的组。 例如,如果他们的用户在TEACHER组中,则会为其创建TEACHER\u配置文件 问题是,在设置用户的组之前触发的信号给了我错误“非类型”对象没有属性“名称” #views.py def register_page(request): if request.POST: password = request.POST['password'] repassword = request.POST[

我正在创建一个信号,为
用户
创建一个配置文件,考虑到他们所在的
。 例如,如果他们的用户在
TEACHER
组中,则会为其创建
TEACHER\u配置文件

问题是,在设置用户的
之前触发的信号给了我错误
“非类型”对象没有属性“名称”

#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, 'پسورد ها مطابقت ندارند')
我已经尝试了
m2m\u changed
,它为
set\u password
带来了其他问题,它使用户实例
None类型
,因为应该保存它来触发
m2m\u 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, 'پسورد ها مطابقت ندارند')
另外,如果你想让它更具可读性,只需将它提取到单独的函数中即可


这对您有用吗?

M2Ms在实例保存后保存,您很可能会面临多对多关系的其他问题,即使您要解决这个问题,一个选项可能是同时使用m2m_changed和post_save,但这样您将执行多次,没有其他解决方法了?感谢您的回答,它是有效的。但最好能使用信号。因为干的东西。
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, 'پسورد ها مطابقت ندارند')