2015-07-29 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 __init__(self, request=None, *args, **kwargs): 
     self.request = request 
     self.user_cache = None 
     super(AuthenticationForm, self).__init__(*args, **kwargs) 

     UserModel = get_user_model() 
     self.username_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD) 
     if self.fields['username'].label is None: 
      self.fields['username'].label = capfirst(self.username_field.verbose_name) 

    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', 
        params={'username': self.username_field.verbose_name}, 
      ) 
      else: 
       self.confirm_login_allowed(self.user_cache) 

     return self.cleaned_data 

    def confirm_login_allowed(self, user): 
     if not user.is_active: 
      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:

@csrf_protect 
@never_cache 
def login(request, template_name='login.html', 
     authentication_form=AuthenticationForm, 
     extra_context=None): 

    if request.method == "POST": 
     form = authentication_form(request, data=request.POST) 
     if form.is_valid(): 
      return HttpResponseRedirect(reverse('student:mains')) 

     else: 
      print(form.errors) 
    else: 
     form = authentication_form(request) 

    context = { 
     'form': form, 
    } 

    return TemplateResponse(request, template_name, context) 

мой шаблон Логин:

<html> 
<head><title>Login</title></head> 
<strong> Mysite Login </strong> 
<br><br> 
<h3> Please Enter your credentials carefully </h3> 
<body> 

{% if form.errors %} 
    <p>NOT VALID</p> 
    {% for errors in form.errors %} 
     {{ errors }} 
    {% endfor %} 
{% endif %} 
<form method="post"> 
    {% csrf_token %} 
    <label>Username: </label> 
    <input type="text"> 
    <br> 
    <label>Password: </label> 
    <input type="password"> 
    <br> 
    <input type="submit" value="Login"> 
</form> 

</body>  
</html> 

мой 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.login, name='login'), 
    url(r'^logout/$', views.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'), 
] 

Я пытаюсь реализовать django-authentication в моем проекте. Я прочитал несколько документов и сделал указанные выше виды и формы проверки подлинности.

Проблема в том, что когда я отправляю свою регистрационную форму с правильными учетными данными, она не перенаправляет меня в место перенаправления, как указано в моих представлениях. Он ничего не делает.

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

Пожалуйста, предложите мне способ это исправить ...

Спасибо! в Advance ...

Еще перед тем же вопросом ...

ответ

0

Изменить это:

<form method="post"> 
<label>Username: </label> 
<input name="name"> 

<label>Password: </label> 
<input name="phone"> 

к,

<form method="post" action="{% url 'login_url_name' %}"> 

<label>Username: </label> 
<input name="username"> 

<label>Password: </label> 
<input name="password"> 
+0

все еще сталкивается с тем же вопросом .... –

0

Отладочных предложения:

  • Марки убедитесь, что вы видите правильный вид, когда вы Убрать форму. Как? Добавить регистрацию отладки в начале login(). Если вы не видите регистрацию при отправке, обязательно установите для атрибута <form> значение action.
  • Убедитесь, что Ваша форма прошла is_valid() тест. Добавьте отладочную регистрацию внутри ветки if form.is_valid(): на ваш взгляд. Если это не работает, убедитесь, что учетные данные верны. Дамп request.POST, чтобы увидеть, что может быть неправильно с данными, представленными формой.

Debug каротаж может быть в вашем коде простой Exception("HEYY!!"). Цель состоит в том, чтобы убедиться, что ваш код достигает соответствующей ветви. Вы будете уверены, что это произойдет, если вы увидите, как Django кричит на вас.