为什么信号在错误的时间触发?
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_changed
为 set_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, 'پسورد ها مطابقت ندارند')
此外,如果您想使其更具可读性,只需将其提取到单独的函数等中即可。
这对你有用吗?
我正在创建一个信号,考虑到他们所在的 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_changed
为 set_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, 'پسورد ها مطابقت ندارند')
此外,如果您想使其更具可读性,只需将其提取到单独的函数等中即可。
这对你有用吗?