【问题标题】:why signal triggered in wrong time?为什么信号在错误的时间触发?
【发布时间】:2020-10-09 11:30:31
【问题描述】:

考虑到他们所在的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 信号。

我们将不胜感激。

【问题讨论】:

  • M2M 在保存实例后保存,即使您解决了这个问题,您也很可能会面临多对多关系的其他问题,一个选项可能是同时使用 m2m_changed 和 post_save,但这多次执行的方式
  • 没有其他问题?

标签: python django model django-signals


【解决方案1】:

您可以尝试在视图中立即完成它

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, 'پسورد ها مطابقت ندارند')

另外,如果你想让它更具可读性,只需将其提取到单独的函数等中。

这对你有用吗?

【讨论】:

  • 感谢您的回答,它有效。但最好能够使用信号。由于干燥的东西。
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2018-06-09
  • 2018-01-28
相关资源
最近更新 更多