Django "login () accetta esattamente 1 argomento (2 dati)" errore


86

Sto cercando di memorizzare l'ID dell'utente nella sessione utilizzando django.contrib.auth.login. Ma non funziona come previsto.

Ricevo l'errore login () richiede esattamente 1 argomento (2 dati)

Con login (utente) ricevo AttributeError in / login / L'oggetto 'utente non ha attributo' metodo '

Sto usando un modulo di esempio leggermente modificato 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 in 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 far funzionare login ().


4
funzionerà se rinomini la visualizzazione
Evgeny

Solo la domanda e la risposta che stavo cercando. Uno dei numerosi errori che stavo facendo durante il tentativo di ottenere gli accessi attivi e funzionanti in django, insieme all'utilizzo di Contexts vs RequestContexts e di tralasciare csrf_tokens.
Chucksmash

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

Risposte:


236

Viene anche chiamata la funzione di visualizzazione logine la chiamata a login(request, user)finisce per essere interpretata come un tentativo di chiamare questa funzione in modo ricorsivo:

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

Per evitarlo, rinominare la funzione di visualizzazione o fare riferimento a loginda django.contrib.authin un modo diverso. Ad esempio, potresti modificare l'importazione per rinominare la funzione di accesso:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

Wow, stavo sfogliando il codice sorgente di Django e provando tutte le versioni precedenti disponibili, pensando che stavo impazzendo
Mojimi

16

Una possibile soluzione:

from django.contrib import auth

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

Ora il nome della tua vista non sovrascrive il nome della vista di django.


9

Un altro modo:

from django.contrib.auth import login as auth_login

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.