2010-09-02 12 views
2

J'ai étendu le modèle utilisateur en utilisant la méthode UserProfile. Cependant, je reçois parfois le message d'erreur Django UserProfile matching query does not exist lors de l'exécution de la requête request.user.get_profile()Django - rediriger vers la page de connexion si la requête correspondante UserProfile n'existe pas Erreur

Je pense que cela se produit lorsque je suis déconnecté du système afin que mon utilisateur devienne un AnonymousUser. Est-il possible de rediriger automatiquement l'utilisateur vers la page de connexion si aucun UserProfile n'existe. J'utilise request.user.get_profile() en quelques endroits, donc je ne veux pas vraiment passer mon code à mettre des chèques sur tout le monde donc je pensais à un moyen d'utiliser des signaux ou quelque chose de similaire où je n'ai à le faire qu'une seule fois.

Aussi j'utilise @login_required sur mes appels de fonction mais cela ne semble pas rediriger l'utilisateur avant qu'ils obtiennent cette erreur.

Chaque utilisateur enregistré doit avoir un compte UserProfile car celui-ci est automatiquement créé s'il n'en a pas lorsqu'il se connecte au système.

Je suis également en utilisant Django 1,1

Répondre

0

donc Pensais d'une manière en utilisant des signaux ou quelque chose de similaire où je ne le faire qu'une seule fois.

AFAIK vous ne pouvez pas faire cela avec un signal. Vous pouvez cependant créer un décorateur personnalisé pour remplacer login_required. Ce décorateur peut envelopper login_required et vérifier le profil de l'utilisateur. Vous pouvez ensuite remplacer le login_required de Django par le vôtre dans l'instruction import.

+0

Je ne suis pas familier avec les décorateurs personnalisés. Pouvez-vous me donner un exemple de comment faire cela? – John

0

Le décorateur @login_required s'assure que l'utilisateur est connecté. Cette erreur est probablement due au fait que certains enregistrements utilisateur n'ont pas de profil utilisateur. Vous pouvez le tester dans la coquille

from django.contrib.auth.models import * 
for u in User.objects.all(): 
    try: 
     u.get_profile() 
    except: 
     print "%s does not have a profile" % u 
2

cela devrait fonctionner

def profile_required(): 
    def has_profile(user): 
     try: 
      user.get_profile() 
     except: 
      return False 
     else: 
      return True 
    return user_passes_test(lambda u: has_profile(u))