2016-06-06 4 views
2

Je voudrais que le décorateur @login_required de Django teste si un champ particulier d'un utilisateur a été défini sur autre chose que None. (Le champ ajouté a null = true et un défaut de None.)Comment puis-je modifier le décorateur login_required de Django sur une installation personnalisée de Pinax?

Nouvellement créés Les objets Utilisateur ont en effet la valeur Aucun pour le champ, mais un changement évident à @login_required n'a pas fait de différence notable dans le comportement (I redémarré Gunicorn pour assurer une lecture fraîche). Les vues @login_required sont rendues si l'utilisateur est authentifié, même si le champ ajouté est None.

Le présent, un peu changé @login_required est:

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

Le lambda d'origine était u.is_authenticated().

Répondre

2

Je vois de votre code, que vous avez effectivement rencontré user_passes_test et c'est en fait ce que vous devez utiliser au lieu de modifier le code source de login_required directement.

user_passes_test() prend un argument requis: un appelable qui prend un objet utilisateur et retourne Vrai si l'utilisateur est autorisé à afficher la page. Notez que user_passes_test() ne vérifie pas automatiquement que l'utilisateur n'est pas anonyme.

Vous venez de créer une fonction qui s'assure que vos conditions sont remplies. Cela fait en sorte que tout reste dans votre base de code (une mise à jour de django ne cassera pas votre application) et le rend beaucoup plus facile à déboguer.

votre fonction de test pourrait être.

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