2013-10-09 17 views
0

我試圖覆蓋模型實例的__nonzero__所以它的計算結果爲False的Django模型實例__nonzero__能戰勝忽略

我第一次在一個簡單的Python類測試:

>>> class A(): 
...  pass 
... 
>>> a = A() 
>>> a.__nonzero__ = lambda: False 
>>> b = A() 
>>> bool(a) 
False 
>>> bool(b) 
True 
>>> type(a).__nonzero__(a) 
False 
>>> type(b).__nonzero__(b) 
True 

這表明__nonzero__成功地重寫改變對象的bool()評價。

然後,我嘗試將相同的東西應用到django模型對象(自己從`django.db.models.Manager繼承的feincms.module.page.Page的實例)。

from django.contrib import admin 
from django.utils.translation import ugettext_lazy as _ 
from feincms.module.page.modeladmins import PageAdmin 
from feincms.module.page.models import Page 
from guardian.admin import GuardedModelAdmin 
from reversion import VersionAdmin 


class PageAdmin(PageAdmin, GuardedModelAdmin, VersionAdmin): 

    # some stuff 
    # ... 
    # 

    def render_revision_form(self, *args, **kwargs): 
     """Override render_revision_form so we can make ``obj`` evaluate to False 
     so ``feincms.module.page.forms.PageAdminForm.clean()`` does not try 
     to query ``self.page_manager.get(pk=current_id)`` where current_id 
     is ``obj.pk`` in the below function. 
     This is needed because ``self.page_manager.get(pk=current_id)`` is 
     queried on feincms Page objects rather than reversion Version objects. 
     """ 
     request, obj, version, context = args 
     obj.__nonzero__ = lambda: False 
     obj.hello = 'a' 
     import pdb 
     pdb.set_trace() 
     return super(PageAdmin, self).render_revision_form(request, obj, version, context, **kwargs) 

admin.site.register(Page, PageAdmin) 

但這種計算結果爲True

(Pdb) obj 
<Page: test> 
(Pdb) bool(obj) 
True 

有什麼理由說我是不知道的,可能會導致這種行爲?

+0

這只是傷心。 –

回答

0

您使用本示例中的舊式類。和模型實例是一種新式類。

class B(object): pass 
b = B() 
b.__nonzero__ = lambda: False 
bool(b) # True 

顯然,您不能覆蓋實例的特殊方法,僅適用於類型。

B.__nonzero__ = lambda self: False 
bool(b) # False 

閱讀實例和更詳細的解釋如下SO問題:"overriding-special-methods-on-an-instance"

+0

這是不幸的。謝謝您的回答,雖然,我不知道它是新/舊樣式類不同。我最終解決以另一種方式我的問題(覆蓋形式方法,更好的我猜的)。 – rxdazn