我試圖覆蓋模型實例的__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
有什麼理由說我是不知道的,可能會導致這種行爲?
這只是傷心。 –