django 中的逻辑非操作
Logical NOT operation in django
我有一个切换用户状态(活动-非活动)的视图函数:
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还是False!
我不确定你为什么需要一个 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}))
url捕获的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
not False 将始终 return True
>>> not False
>>> True
不 'False' 将始终 return 错误
>>> not 'False'
>>> False
原因是,任何非空字符串的计算结果都是布尔值 True
>>> if 'False':
>>> print 'False in string but not boolean False'
>>> 'False in string but not boolean False'
作为回顾字符串 'False' 不等于 bool 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}))
我有一个切换用户状态(活动-非活动)的视图函数:
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还是False!
我不确定你为什么需要一个 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}))
url捕获的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
not False 将始终 return True
>>> not False
>>> True
不 'False' 将始终 return 错误
>>> not 'False'
>>> False
原因是,任何非空字符串的计算结果都是布尔值 True
>>> if 'False':
>>> print 'False in string but not boolean False'
>>> 'False in string but not boolean False'
作为回顾字符串 'False' 不等于 bool 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}))