Странный результат декоратора при сравнении связанных объектов - PullRequest
0 голосов
/ 11 ноября 2009

В представлениях, которые позволяют обновлять / удалять объекты, мне нужен декоратор, который проверяет принадлежность редактируемого объекта к группе (модель "loja"). Оба определены в URL:

/ [slog model loja - s_loja] / [viewname-ex: addmenu] / [идентификатор объекта - 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 Ответ

1 голос
/ 11 ноября 2009

Заменить is not на !=.

not loja оценивается как True, а оператор if проверяет равенство между objecto.loja и True.

...