2009-07-15 15 views
83

Sto tentando di memorizzare l'ID dell'utente nella sessione utilizzando django.contrib.auth.login. Ma non funziona come non previsto.Django "login() richiede esattamente 1 argomento (2 dato)" errore

sto ottenendo errore login() prende esattamente 1 argomento (2 dato)

con login (utente) sto ottenendo AttributeError a/login/utente' oggetto non ha attributo 'metodo'

sto tramite il modulo esempio un po 'modifyed http://docs.djangoproject.com/en/dev/topics/auth/:

from django.shortcuts import render_to_response 
from django.contrib.auth import authenticate, login 

def login(request): 
    msg = [] 
    if request.method == 'POST': 
     username = request.POST['u'] 
     password = request.POST['p'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       msg.append("login successful") 
      else: 
       msg.append("disabled account") 
     else: 
      msg.append("invalid login") 
    return render_to_response('login.html', {'errors': msg}) 

non c'è niente di speciale login.html:

<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <form action="/login/" method="post"> 
     Login:&nbsp; <input type="text" name="u"> 
    <br/> 
     Password:&nbsp; <input type="password" name="p"> 
     <input type="submit" value="Login"> 
    </form> 
    {% if errors %} 
     <ul> 
      {% for error in errors %} 
      <li>{{ error }}</li> 
      {% endfor %} 
     </ul> 
    {% endif %} 

</body> 
</html> 

Qualcuno ha idea di come fare login() funziona.

+3

funzionerà se si rinomina la vista – Evgeny

+0

Solo la domanda e la risposta che stavo cercando. Uno dei tanti errori che stavo facendo mentre cercavo di ottenere gli accessi attivi e funzionanti in django, insieme all'utilizzo di Contesti vs RequestContexts e tralasciare csrf_tokens. – chucksmash

+0

qui puoi trovare un tutorial sugli utenti di Django http://lowcoupling.com/post/71289666862/django-the-user-tutorial c'è anche un progetto GitHub che puoi clonare e controllare – lowcoupling

risposta

230

tua funzione di visualizzazione è anche chiamato login, e la chiamata a login(request, user) finisce per essere interpretato come un tentativo di chiamare questa funzione in modo ricorsivo:

def login(request): 
    ... 
    login(request, user) 

Per evitarlo rinominare la funzione visualizzazione oppure consultare la login da django.contrib.auth in qualche modo diverso. Si potrebbe ad esempio cambiare l'importazione di rinominare la funzione di login:

from django.contrib.auth import login as auth_login 

... 
auth_login(request, user) 
+0

Wow, stavo dando un'occhiata al codice sorgente di Django e provando tutte le versioni precedenti disponibili, pensando che stavo impazzendo – Mojimi

15

Una possibile soluzione:

from django.contrib import auth 

def login(request): 
    # .... 
    auth.login(request, user) 
    # ... 

Ora il vostro nome di visualizzazione Non sovrascrive nome della vista di Django.

9

Un altro modo:

from django.contrib.auth import login as auth_login 

quindi chiamare auth_login(request, user) invece di login(request, user).

Problemi correlati