Django "login () tam olarak 1 argüman alıyor (2 verildi)" hatası


86

Kullanıcının kimliğini django.contrib.auth.login kullanarak oturumda saklamaya çalışıyorum. Ancak beklendiği gibi çalışmıyor.

Hata alıyorum login () tam olarak 1 argüman alıyor (2 verildi)

Login (kullanıcı) ile / login / User 'nesnesinde AttributeError alıyorum ' nesnesinin 'method' niteliği yok

Biraz değiştirilmiş örnek formunu kullanıyorum 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})

login.html hakkında özel bir şey yoktur:

<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>

Login () işlevinin nasıl çalıştırılacağı hakkında fikri olan var mı?


4
görünümünüzü yeniden adlandırırsanız işe yarayacak
Evgeny

Sadece aradığım soru ve cevap. Contexts vs RequestContexts kullanmak ve csrf_tokens'i dışarıda bırakmakla birlikte, django'da oturum açmaya ve çalıştırmaya çalışırken yaptığım birkaç hatadan biri.
chucksmash

burada Django kullanıcıları hakkında bir öğretici bulabilirsiniz lowcoupling.com/post/71289666862/django-the-user-tutorial Ayrıca
klonlayıp

Yanıtlar:


235

Görünüm işleviniz de çağrılır loginve login(request, user)sona eren çağrı, bu işlevi yinelemeli olarak çağırma girişimi olarak yorumlanır:

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

Sizin bakış fonksiyonunu yeniden adlandırmak ya bakın önlemek için logingelen django.contrib.authbazı farklı bir şekilde. Örneğin, giriş işlevini yeniden adlandırmak için içe aktarmayı değiştirebilirsiniz:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

Vay canına, Django'nun kaynak koduna göz
atıyordum

16

Olası bir çözüm:

from django.contrib import auth

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

Artık görünüm adınız, django'nun görünüm adının üzerine yazmıyor.


9

Diğer yol:

from django.contrib.auth import login as auth_login

auth_login(request, user)yerine arayın login(request, user).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.