2017-04-06 103 views
0

操作我有一個切換用戶狀態(有效無效)的視圖功能:邏輯非在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,它通過使假工作正常。但是如果current_state是False,它仍然是False。

我也試過print(not current_state),但是令人驚訝的是不是False仍然是False!

+0

嘗試同時打印'curernt_state'和'not current_state'。 – AKS

+0

這聽起來很愚蠢,但是你在'current_state'中使用布爾運算符還是字符串? –

回答

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})) 
+0

感謝您的回答。是的,我沒有一個額外的參數。 –

1

current_state由URL捕獲始終是一個字符串。所以,你的情況是"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 
+0

這在確定問題的根源時是正確的,但我認爲AKS的答案更好,因爲它提供了一種更直接的方法來實現此功能。 –

+0

@VasilyAlexeev。當然。我剛剛發佈它,因爲OP傳遞'current_state'作爲url參數。如果沒有它,同樣的事情可以發揮作用,那麼'AKS'的答案,更好,但! –

+0

感謝您的回答。你已經證明了我的錯。從url捕獲的current_state是一個字符串。 –

0

沒有虛假記載,將始終返回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' 

爲AA回顧字符串 '假' 不等於BOOL FALSE

我通常在這裏做的就是寫一個將任何潛在的真或假的意義翻譯成布爾值的真理函數

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

s o現在你可以做

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}))