根据组将新用户设置为非活动状态-Django

时间:2020-05-20 13:09:25

标签: python django

我目前正在忙于我的用户应用程序,并试图找到一种将新用户添加到不同预定义组的方法。我对其中一个组的sign_up视图如下:

def signup_view_zakelijk(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            group = Group.objects.get(name='zakelijk')
            user.groups.add(group)
            return redirect('user:login')
        return render(request, 'user/signup.html', {'form': form})
    else:
        form = UserCreationForm()
    return render(request, 'user/signup.html', {'form': form})

在保存表单之后保存该组。保存,所以我发出了post_save信号:

@receiver(post_save, sender=User)
def user_zakelijk_inactive(sender, instance, **kwargs):
    group = Group.objects.values_list('name', flat=True)
    print(group)
    if group == 'zakelijk':
        if instance._state.adding is True:
            instance.is_active = False
        else:
            return
    else:
        return

我已经设置了print语句,以检查是否已打印用户组名称,并且该方法有效。但是默认情况下,新添加的用户不是不活动的。当我消除if group =='zakelijk'条件条件时,信号会正常工作,但也会对其他用户组执行(因此,每个新用户默认都处于非活动状态-仅在组'zakelijk'中需要此信号。

正常工作的信号代码:

@receiver(pre_save, sender=User)
def user_zakelijk_inactive(sender, instance, **kwargs):
    if instance._state.adding is True:
        instance.is_active = False
    else:
        return

有人有一些想法可以补充条件吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

因为,您正在与列表进行比较,我认为您不是从if语句传递过来的。我认为应该可以:

@receiver(post_save, sender=User)
def user_zakelijk_inactive(sender, instance, **kwargs):
    group = instance.groups.values_list('name', flat=True)
    print(group)
    if 'zakelijk' in group:
        if instance._state.adding is True:
            instance.is_active = False
        else:
            return
    else:
        return

答案 1 :(得分:0)

首先,您正在尝试使用python / Django /数据库可以为您完成的事情。其次-您不保存:

# Only check if a group exists that is named "zakelijk"
if instance.groups.filter(name='zakelijk').exists():
    instance.is_active = False
    # One could use update_fields=['is_active'], but in practice
    # user instances are not big entities.
    instance.save()

有关详细信息,请参见the documentation。由于Group.name是唯一字段,因此其性能与示例中的主键查找相当。