2010-08-17 13 views
1

Je suis relativement nouveau pour django ..authentification de connexion django

Dans l'application que je construis, il existe plusieurs types d'utilisateurs (c.-à-Utilisateur1, Utilisateur2, Utilisateur3) qui sont tous héritant de django.contrib .auth.models.User et lors de la connexion, chaque utilisateur doit être redirigé vers une page de succès en fonction du type d'utilisateur qu'ils sont.

En views.py:

def login_attempt(request): 

user = request.user 
data = {} 


username = request.POST['username'] 
password = request.POST['password'] 
user = authenticate(username=username, password=password) 
if user is not None:  
    if user.is_active: 
     login(request, user) 

     try: 
      User1.objects.get(username = user.username) 
      type = "undergrad" 
     except ObjectDoesNotExist: 
      pass 

     try: 
      User2.objects.get(username = user.username) 
      type = "grad" 
     except ObjectDoesNotExist: 
      pass 

     try: 
      User3.objects.get(username = user.username) 
      type = "sponsor" 
     except ObjectDoesNotExist: 
      pass 

     return render_to_response (
       "templates/success_"+type+".html", 
       data, 
       context_instance=RequestContext(request) 
     ) 

    else: 
     return render_to_response (
       "templates/fail1.html", 
       data, 
       context_instance=RequestContext(request) 
     ) 
else: 
    return render_to_response (
      "templates/fail2.html", 
      data, 
      context_instance=RequestContext(request)) 

et type(user) est <class 'django.contrib.auth.models.User'>

Je les tests en cours d'exécution par "test manage.py" - l'authentification et réoriente travaillent pour Utilisateur1 et Utilisateur2 avec succès, cependant, il ne s'authentifie pas pour User3 et renvoie le modèle "fail2.html". Tous les autres tests avec User3 ont renvoyé des résultats valides.

Des suggestions? Ceci est mon premier post de question, alors n'hésitez pas à poser des questions si j'ai laissé des informations pertinentes!

Merci d'avance.

+1

Que est différent entre les types de classe? –

+0

ils ont chacun un champ de groupe qui ForeignKeys à différentes classes de groupe, qui héritent tous de django.contrib.auth.Group (un peu comme les utilisateurs) – Eunice

+0

Ok, qu'est-ce qui est différent à propos des objets 'Group' qui les rend dignes d'avoir entièrement nouvelles classes? –

Répondre

1

Pas vraiment une réponse à votre question, mais pourquoi ne pas utiliser un user profile pour déterminer votre type et d'autres données spécifiques aux classes UserX? Ils sont faciles à configurer, vous permettent de stocker des informations utilisateur supplémentaires et vous permettent de continuer à utiliser les objets User intégrés.

Les classes de profil sont assez faciles (je levais ce de The Django Book, Chapter 12):

class MySiteProfile(models.Model): 
    # This is the only required field 
    user = models.ForeignKey(User, unique=True) 

    # The rest is completely up to you... 
    type = models.CharField(maxlength=100, blank=True) 

Au-delà, vous changez sur le point de settings.py, et mettre en place un déclencheur pour créer automagiquement le profil sur User création et tu es bon à faire.

Votre code de vue résultant serait considérablement simplifié aussi:

def login_attempt(request): 
    user = request.user 
    data = {} 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None:  
     if user.is_active: 
      login(request, user) 
      type = user.get_profile().type 

      return render_to_response (
       "templates/success_"+type+".html", 
       data, 
       context_instance=RequestContext(request) 
      ) 

     else: 
      return render_to_response (
        "templates/fail1.html", 
        data, 
        context_instance=RequestContext(request) 
       ) 
    else: 
     return render_to_response (
       "templates/fail2.html", 
       data, 
       context_instance=RequestContext(request) 
      ) 
+0

Donc, j'ai actuellement un profil d'utilisateur, le problème étant que chaque type d'utilisateur a des champs spécifiques en fonction de ce type et je ne voulais pas avoir trop de champs NULL .. mais je vais essayer un peu variation de cela. Merci! – Eunice

+0

Pour être honnête, si c'est moins que 45 champs, je ne les normaliserais pas.Le fait de devoir réunir 4 tables 'UserX' différentes, 4 tables' GroupY' différentes et la table 'User' ne vaut absolument pas le coup. –

+0

J'ai compris mon problème, mais je tiens à vous remercier de vos efforts de toute façon! malheureusement, je ne peux pas voter votre réponse jusqu'à bc je manque de réputation, haha! mais merci, Jack! – Eunice

0

Ce n'est pas exactement une réponse à votre problème, mais avez-vous envisagé d'utiliser des groupes/permissions pour différencier les différents types d'utilisateurs plutôt que de créer des sous-classes de auth.User? La fonctionnalité auth de Django est fournie avec un groups/permissions mechanism raisonnablement utile qui peut être utilisé pour rendre votre vie plus facile.

À l'aide de groupes, vous pouvez créer divers groupes («undergrad», «grad», etc.) et accorder à chaque groupe les autorisations appropriées pour obtenir l'effet nécessaire.

+0

C'est très vrai et j'utilise les groupes afin que je puisse essayer et trouver un moyen d'incorporer cela. Merci – Eunice

+0

Merci pour votre suggestion! J'ai compris mon problème, mais je voulais vous remercier pour vos efforts en suggérant les autorisations! – Eunice

+0

Heureux d'aider :) –