django中的逻辑NOT操作

时间:2017-04-06 11:18:57

标签: python django logical-operators

我有一个切换用户状态的视图功能(活动 - 非活动状态):

def toggle_user_state(request, user_id, current_state):
    user = get_object_or_404(User, pk=user_id)
    user.is_active = not current_state
    user.save()
    return HttpResponseRedirect(reverse('cdms:user_details', kwargs={'user_id': user.id}))

如果current_state为True,则将其设为False即可正常工作。但如果current_state为False,则仍为False。

我也试过print(not current_state),但令人惊讶的是,False仍然是假的!

3 个答案:

答案 0 :(得分:1)

我不确定为什么只需在用户上切换current_state时就需要is_active

def toggle_user_state(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    user.is_active = not user.is_active    # take a NOT of active state here
    user.save()
    return HttpResponseRedirect(reverse('cdms:user_details', kwargs={'user_id': user.id}))

答案 1 :(得分:1)

网址捕获的current_state始终是一个字符串。因此,在您的情况下,它将是"True""False"

not "True"  # False
not "False"  # False

一个解决方案就是:

if current_state == "True":
    user.is_active = False
elif current_state == "False":
    user.is_active = True

另一种解决方案是:

# Define a function to the outer scope

def str_to_bool(s):
    if s == 'True':
         return True
    elif s == 'False':
         return False
    else:
         raise ValueError

# Then inside toggle_user_state do this
try:
    user.is_active = not str_to_bool(current_state)
except ValueError:
    # handle error here (its neither "True" or "False")
else:
    # everything worked. Continue

答案 2 :(得分:0)

非False将始终返回True

>>> not False
>>> True

不是'错误'将始终返回False

>>> not 'False'
>>> False

原因是,任何非空的字符串计算为布尔值True

>>> if 'False':
>>>    print 'False in string but not boolean False'
>>> 'False in string but not boolean False'

作为一个回顾字符串' False'不等于bool False

我通常在这里做的是编写一个truthy函数,将任何可能的true或false意图转换为布尔值

def is_true(value):
    if value in ['1', 1, True, 'true', 'yes', 'Yes', 'True']:
        return True
    return False

所以现在你可以做到

def toggle_user_state(request, user_id, current_state):
    user = get_object_or_404(User, pk=user_id)
    current_state = is_true(current_state) # current_state will now be boolean
    user.is_active = not current_state # now, will be boolean opposite
    user.save()
    return HttpResponseRedirect(reverse('cdms:user_details', kwargs={'user_id': user.id}))