2013-03-09 1 views
1

Après avoir créé un modèle UserProfile. J'ai commencé à créer une connexion, mais je suis bloqué à cause de l'erreur get_user().Django 1.5 - Connexion

EXCEPTION
AttributeError: 'LoginForm' object has no attribute 'get_user' 

Voici mes codes:

MISE À JOUR

class LoginView(FormView): 
    form_class = LoginForm 
    redirect_field_name = REDIRECT_FIELD_NAME 
    template_name = 'login.html' 
    success_url = '/' 

    def form_valid(self, form): 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 

     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(self.request, user) 
       return HttpResponseRedirect(self.get_success_url()) 
     else:   
      return self.form_invalid() 

    def form_invalid(self): 
     return HttpResponseRedirect(reverse('accounts:login')) 

    def get_success_url(self): 
     if self.success_url: 
      redirect_to = self.success_url 
     else: 
      redirect_to = self.request.REQUEST.get(self.redirect_field_name, '') 

     netloc = urlparse.urlparse(redirect_to)[1] 
     if not redirect_to: 
      redirect_to = settings.LOGIN_REDIRECT_URL 
     elif netloc and netloc != self.request.get_host(): 
      redirect_to = settings.LOGIN_REDIRECT_URL 
     return redirect_to 

    def post(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     if form.is_valid(): 
      return self.form_valid(form) 
     else:     
      return self.form_invalid() 

Comment résoudre ce problème? Toute aide serait appréciée. Je suis vraiment nouveau sur Django 1.5. Besoin d'aide pour.

+0

Je trouve cela dans la documentation: Si vous avez l'authentification personnalisé (voir l'authentification Personnalisation) vous pouvez passer un formulaire d'authentification personnalisé à la vue de connexion via le paramètre authentication_form Ce formulaire doit accepter un argument de requête dans sa méthode __init__ et fournir une méthode get_user qui renvoie l'objet utilisateur authentifié (cette méthode n'est jamais appelée qu'une fois la validation de formulaire réussie). –

+0

Pouvez-vous poster le code de LoginForm? –

+0

@ AdriánLópez terminer – catherine

Répondre

1

[mise à jour]

Dans le code original, l'auteur est en train de faire les choses authenticate dans une méthode appelée forme get_user. Vous le faites déjà en dehors du formulaire, remplacez simplement form.get_user() par user.

J'utilise une vue connexion qui n'est pas classe basée, et je ne se soucient même pas en utilisant une instance de formulaire Django, mais il devrait être facile à adapter:

def signin(request): 
    if request.method == 'POST': 
     user = authenticate(
      email=request.POST.get('username', '').lower().strip(), 
      password= request.POST.get('password', ''), 
     ) 
     if user is None: 
      messages.error(request, u'Invalid credentials') 
     else: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect(request.GET.get('next', '/')) 
      else: 
       messages.error(request, u'User is not active.') 

    return render_to_response('login.html', locals(),  
         context_instance=RequestContext(request)) 

[ancienne réponse]

Définissez une méthode get_user pour votre formulaire.

Untested (mais devrait vous mettre dans le droit chemin):

def get_user(self): 
    from django.contrib.auth import authenticate 
    return authenticate(
      email=self.cleaned_data.get('username', '').lower().strip(), 
      password=self.cleaned_data.get('password', ''), 
    )    
+0

une autre erreur: objet 'utilisateur' n'a pas d'attribut 'backend' – catherine

+0

@catherine: pourriez-vous essayer le code mis à jour? (J'utilise le champ email comme nom d'utilisateur, s'il vous plaît adapter à vos besoins) –

+0

terminer, ........ – catherine