2009-11-11 95 views
0

在視圖,其允許更新/刪除對象,我需要驗證要被編輯的對象所屬的組(型號「洛哈)一個修飾在URL兩者定義:奇怪裝飾結果

/[slug model loja - s_loja]/[viewname-ex:addmenu]/[object id -obj_id]

因爲對象的模型可以變化,所以裝飾器將對象的模型作爲參數。每個可能作爲參數傳遞的模型都有一個名爲loja的模型「loja」的外鍵。

裝飾器:

def acesso_objecto(modelo): 
    def wrap(f): 
     def wrapper(*args, **kwargs): 
      s_loja = kwargs['s_loja'] 
      obj_id = kwargs['obj_id'] 
      objecto = get_object_or_404(modelo, pk=obj_id) 
      loja = get_object_or_404(Loja, slug=s_loja) 
      if objecto.loja is not loja: 
       raise Http404 
      else: 
       return f(*args, **kwargs) 
     return wrapper 
    return wrap 

基本上,除非組「loja」和對象存在並且對象屬於該組,否則應該引發404錯誤。

如果沒有裝飾器,視圖可以正常工作,但裝飾器總是會引發404,因爲if語句始終爲真,即使它不應該是。如果我使用loja.id或loja.slug進行驗證,它的工作原理與它們相關,但是這個功能似乎總是失敗,我不知道爲什麼。

回答

1

is not替換爲!=

not loja正在評估對True,而if語句測試objecto.lojaTrue之間的平等。

+0

那麼,這是愚蠢的。我以爲是不是一樣!= 但我不知道不低估評價爲真。這與文檔相反。 來自python文檔: 「運算符是和不是測試對象的身份:當且僅當x和y是同一個對象時,x是y是真的,x不是y產生反真值。 然後作爲腳註: 「\t由於自動垃圾收集,空閒列表以及描述符的動態性質,您可能會注意到is運算符在某些用途中看似不尋常的行爲,例如涉及實例方法之間的比較或常量「。 – 2009-11-11 18:16:20

+0

啊,你是對的,我錯了'is'運算符。我應該像你一樣引用文檔。 :-) – 2009-11-11 18:21:09

+0

還是,你指出了正確的方向。謝謝 – 2009-11-11 18:25:58