Kesalahan Django “login () mengambil tepat 1 argumen (2 diberikan)”

86

Saya mencoba menyimpan ID pengguna dalam sesi menggunakan django.contrib.auth.login. Tapi ternyata tidak bekerja tidak seperti yang diharapkan.

Saya mendapatkan error login () membutuhkan tepat 1 argumen (diberikan 2)

Dengan login (pengguna) saya mendapatkan AttributeError di / login / User 'objek tidak memiliki atribut' metode '

Saya menggunakan formulir contoh yang sedikit dimodifikasi 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})

tidak ada yang istimewa tentang 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>

Apakah ada yang tahu cara membuat login () berfungsi.

Alex Bolotov
sumber
4
akan berfungsi jika Anda mengganti nama tampilan Anda
Evgeny
Hanya pertanyaan dan jawaban yang saya cari. Salah satu dari beberapa kesalahan yang saya buat ketika mencoba untuk mendapatkan login dan menjalankan di django, bersama dengan menggunakan Contexts vs RequestContexts dan meninggalkan csrf_tokens.
chucksmash
di sini Anda dapat menemukan tutorial tentang pengguna Django lowcoupling.com/post/71289666862/django-the-user-tutorial ada juga proyek GitHub yang dapat Anda
tiru

Jawaban:

235

Fungsi tampilan Anda juga dipanggil login, dan panggilan ke login(request, user)akhirnya diartikan sebagai upaya untuk memanggil fungsi ini secara rekursif:

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

Untuk menghindarinya, ganti nama fungsi tampilan Anda atau rujuk ke logindari django.contrib.authdengan cara yang berbeda. Misalnya, Anda dapat mengubah impor untuk mengganti nama fungsi login:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)
sth
sumber
Wow, saya sedang menjelajah melalui kode sumber Django, dan mencoba setiap versi lama yang tersedia, mengira saya sudah gila
Mojimi
16

Satu kemungkinan perbaikan:

from django.contrib import auth

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

Sekarang nama tampilan Anda tidak menimpa nama tampilan django.

ars
sumber
9

Cara lain:

from django.contrib.auth import login as auth_login

lalu panggil auth_login(request, user)alih-alih login(request, user).

bbsimon
sumber