相关对象比较的奇怪装饰结果

时间:2009-11-11 17:52:02

标签: python django decorator

在允许更新/删除对象的视图上,我需要一个装饰器来验证要编辑的对象属于一个组(模型“loja)。两者都在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 个答案:

答案 0 :(得分:1)

is not替换为!=

not loja正在评估True,if语句正在测试objecto.lojaTrue之间的相等性。