2016-06-06 3 views
2

Я хотел бы, чтобы у дизайнера Django @login_required было ли какое-либо поле на пользователе настроено на что-то другое, кроме None. (Добавленное поле имеет значение null = true и значение по умолчанию отсутствует.)Как я могу изменить конструктор Django login_required на пользовательской установке Pinax?

Недавно созданные объекты пользователя действительно имеют значение None для поля, но очевидное изменение на @login_required не привело к заметной разнице в поведении (I перезапущен Gunicorn, чтобы обеспечить свежее чтение). @login_required Представления отображаются, если пользователь аутентифицирован, даже если добавленное поле равно None.

Настоящее, немного изменен @login_required является:

def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME): 
    """ 
    Decorator for views that checks that the user is logged in, redirecting 
    to the log-in page if necessary. 
    """ 
    actual_decorator = user_passes_test(
     lambda u: u.foo != None, 
     redirect_field_name=redirect_field_name 
    ) 
    if function: 
     return actual_decorator(function) 
    return actual_decorator

оригинальный лямбда был на u.is_authenticated().

ответ

2

Я вижу из вашего кода, что вы действительно столкнулись с user_passes_test, и это на самом деле то, что вы должны использовать вместо того, чтобы напрямую изменять исходный код login_required.

user_passes_test() принимает необходимый аргумент: отзывной, который принимает объект пользователя и возвращает истину, если пользователь может просматривать страницу. Обратите внимание, что user_passes_test() не проверяет автоматически, что Пользователь не является анонимным.

Вы просто создаете функцию, обеспечивающую соблюдение ваших условий. Это гарантирует, что все останется в вашей базе кода (обновление django не нарушит ваше приложение) и делает его намного проще для отладки.

ваш тест функция бывает.

def is_foo(user): 
    if user.is_authenticated() and user.foo : 
     return True