2015-07-30 3 views
0

forms.py:как войти в систему с помощью форм?

from django import forms 
from django.contrib.auth import authenticate, get_user_model 
from django.contrib.auth.models import User 
from django.forms import ModelForm 
from django.utils.text import capfirst 
from .models import Classname, Sectionname, Teachername, Attendancename 

class AuthenticationForm(forms.Form): 
    username = forms.CharField(max_length=20) 
    password = forms.CharField(widget=forms.PasswordInput) 
    error_messages = { 
     'invalid_login': ("Please enter a correct %(username)s and password." 
          "Note that both fields may be case-sensitive."), 
     'inactive': ("This account is inactive"), 
    } 

    def clean(self): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 

     if username and password: 
      self.user_cache = authenticate(username=username, password=password) 

      if self.user_cache is None: 
       raise forms.ValidationError(
        self.error_messages['invalid_login'], 
        code='invalid_login', 
       ) 
      else: 
       self.confirm_login_allowed(self.user_cache) 

     return self.cleaned_data 

    def confirm_login_allowed(self, user): 
     if user.is_active: 
      login(self.user) /** It raises error here... **/ 
     else: 
      raise forms.ValidationError(
       self.error_messages['inactive'], 
       code='inactive', 
       ) 

    def get_user_id(self): 
     if self.user_cache: 
      return self.user_cache.id 
     return None 

    def get_user(self): 
     return self.user_cache 

views.py:

from django.shortcuts import render, get_object_or_404 
from django.core.urlresolvers import reverse 
from django.contrib.auth import authenticate, login, logout 
from django.contrib.auth.decorators import login_required 
from django.http import Http404, HttpResponseRedirect, HttpResponse 
from django.template.response import TemplateResponse 
from django.views.generic import DeleteView, ListView 
from django.views.decorators.csrf import csrf_protect 
from django.views.decorators.cache import never_cache 
from .models import Classname, Sectionname, Teachername, Attendancename 
from .forms import ClassnameForm, SectionnameForm, TeachernameForm, AttendancenameForm, UserForm, PasswordChangeForm, AuthenticationForm 

def user_login(request): 
    if request.method == 'POST': 

     form = AuthenticationForm(request.POST) 

     if form.is_valid(): 
      return HttpResponseRedirect(reverse('student:mains')) 
     else: 
      print(form.errors) 
    else: 
     form = AuthenticationForm() 
    return render(request, 'login.html', {'form': form},) 

urls.py:

from django.conf.urls import url, patterns 
from django.contrib.auth import views as auth_views 
from . import views 

urlpatterns = [ 
    url(r'^register/$', views.register, name='register'), 
    url(r'^login/$', views.user_login, name='login'), 
    url(r'^logout/$', views.user_logout, name='logout'), 
    url(r'^password_change/$', auth_views.password_change, {'template_name': 'password_change_form.html', 'post_change_redirect': '/stu/password_change/done/'}, name="password_change"), 
    url(r'^password_change/done/$', auth_views.password_change_done, {'template_name': 'password_change_done.html'}, name="password_change_done"), 
    url(r'^restricted/', views.restricted, name='restricted'), 
    url(r'^mains/', views.mains, name = 'mains'), 
] 

Я новичок Джанго аутентификации. Я пытаюсь сделать что-то в соответствии с документами, которые я прочитал. Как вы видите выше, у меня есть вид 'user_login' и форма 'AuthenticationForm'.

Я пытаюсь войти в систему, но не знаю, как это сделать? Поскольку я пробовал это на мой взгляд, но не работал.

Тогда я попробовал его в своем методе формы , но не работает.

Есть ли другой способ его реализации?

Пожалуйста, примите во внимание! Может ли кто-нибудь помочь мне исправить это?

Заранее спасибо ....

ответ

1

login функция принимает запрос в качестве первого параметра. Таким образом, вы должны написать confirm_login_allowed так:

def confirm_login_allowed(self, request): 
     if self.user_cache.is_active: 
      login(request,self.user_cache) 
     else: 
      raise forms.ValidationError(
       self.error_messages['inactive'], 
       code='inactive', 
       ) 

И называть его в представлении, как этот

def user_login(request): 
    if request.method == 'POST': 

     form = AuthenticationForm(request.POST) 

     if form.is_valid(): 
      form.confirm_login_allowed(request) 
      return HttpResponseRedirect(reverse('student:mains')) 
     else: 
      .... 

Также не называют confirm_login_allowed метод из чистого метода, потому что does't имеют request.