2016-06-10 3 views
2

У меня есть следующий код, и я получаю сообщение об ошибке сказав: «объект Пользователь не имеет POST атрибут»как использовать Джанго логин

def login (request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(user) 
      return render(request, 'base_in/base_in.html', {}) 
     else: 
      return render(request, 'signupapp/error.html', {'message':'the acount is not active'}) 
    else: 
     return render(request, 'signupapp/error.html', {'message':'username and password is incorrect'}) 

Я также попробовал этот код и получил другую ошибку: «вход() принимает 1 позиционный аргумент, но 2 даны «

def login (request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(user) 
      return render(request, 'base_in/base_in.html', {}) 
     else: 
      return render(request, 'signupapp/error.html', {'message':'the acount is not active'}) 
    else: 
     return render(request, 'signupapp/error.html', {'message':'username and password is incorrect'}) 

Что я делаю неправильно? На основе Джанго учебники он должен работать правильно:

https://docs.djangoproject.com/en/1.9/topics/auth/default/#how-to-log-a-user-in

ответ

3

Что произошло, вы пытаетесь вызвать login из from django.contrib.auth, но вы также определяете свои функции называется login(), у вас есть вид конфликта имен здесь.

Вы должны переименовать это в нечто другое, например. login_view()

from django.contrib.auth import authenticate, login 

def login_view(request): # If you call it login, 
         # you get conflict with login imported aove 
    # The rest of your code here 
    # now if you call login(user), it will use the correct one, 
    # i.e. the one imported from django.contrib.auth 

Если вы не хотите переименовать, вы можете импортировать Джанго login под другим именем, например,

from django.contrib.auth import login as auth_login 

# Then use auth_login(user) in your code 
0

Я бы посоветовал добавить регистрационную форму первый

class LoginForm(forms.Form): 
    username = forms.CharField() 
    password = forms.CharField(widget=forms.PasswordInput)#hides password on input 

затем

from django.http import HttpResponseRedirect,HttpResponse 
from django.contrib.auth import authenticate, login 
. 
. 


def user_log(request): 
    #if you add request.method=='POST' is it a bug i dont know y 
    if request.method: 
    form = LoginForm(request.POST) 
    if form.is_valid(): 
     cleandata=form.cleaned_data 
     #authenticate checks if credentials exists in db 
     user=authenticate(username=cleandata['username'], 
          password=cleandata['password']) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect("your template") 
      else: 
       return HttpResponseRedirect("your templlate") 
     else: 
      return HttpResponse("Invalid login") 
    else: 
     form=LoginForm() 
    return render(request, 'registration/login.html',{'form':form}) 
+0

Можете ли вы объяснить, почему это лучше добавить журнал в форме в то время как я могу использовать django.contrib. auth.models.User и иметь шаблон входа? –

+0

@ bakkal ответ лучше. Но, похоже, я столкнулся с той же проблемой, что и я решил. –

Смежные вопросы