Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Почему не работает унаследованная форма? [RSS Feed]

#1 Май 8, 2014 14:01:04

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

Почему не работает унаследованная форма?

помогите пожалуйста исправить процесс авторизации.

я создаю форму AuthenticationCustomForm (наследуя от AuthenticationForm):

from django.contrib.auth.forms import AuthenticationForm
class AuthenticationCustomForm(AuthenticationForm):
    username = forms.CharField(
        label='Имя пользователя',
        widget=forms.TextInput(attrs={
            'placeholder': 'Логин',
        }),     
    )
    password = forms.CharField(
        label='Пароль', 
        widget=forms.PasswordInput(attrs={
            'placeholder': 'Пароль',
        }),
    )
views.py:

def login(request):
    if(request.method == "POST"):
        form = AuthenticationCustomForm(request.POST)
        with open(os.path.join(settings.BASE_DIR, "1.txt"), "wb") as f:
            f.write(bytes('1', 'UTF-8'))        
        if form.is_valid():
            with open(os.path.join(settings.BASE_DIR, "2.txt"), "wb") as f:
                f.write(bytes('2', 'UTF-8'))            
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')
            user = auth.authenticate(username=username, password=password)
            if user is not None and user.is_active:
                auth.login(request, user)
                return HttpResponseRedirect('/' + str(request.user.pk) + '/')
    else:
        form = AuthenticationCustomForm()
    t = loader.get_template('accounts/login.html')
    c = RequestContext(request, {
        'form': form, 
    }, [custom_proc])   
    return HttpResponse(t.render(c))
login.html:
 {% for field in form %} {{ field.error }} {% endfor %} 
<form class="login_form" action="{% url 'login' %}" method="post">
    {% csrf_token %}
    <div class="cell">
        {{ form.username }}
        {{ form.username.errors }}
         {{form.non_field_errors}}
    </div>
    <div class="cell">
        {{ form.password }}
        {{ form.password.errors }}
         {{form.non_field_errors}}
    </div>
    <div class="cell">
        <input class="submit btn btn-info" type="submit" value="Войти" />
    </div>
</form>
urls.py:

url(r'^accounts/login/$', 'views.login', name='login', ),
в результате пользователь не может войти через эту форму даже если вводит правильные логин и пароль(остаётся на этом же экране, сообщение об ошибке валидации на экран не выводится). при этом создаётся отладочный файл “1.txt”, но не создаётся “2.txt”

нельзя ли предложить решение, основанное на стандартной логике для данной ситуации? не используя приёмы ниндзя(на стековерфлоу предложили пока только такие. причем они криво работают)

Офлайн

#2 Май 8, 2014 15:28:10

pythonlove
Зарегистрирован: 2014-04-22
Сообщения: 16
Репутация: +  4  -
Профиль   Отправить e-mail  

Почему не работает унаследованная форма?

AuthenticationForm, от которого вы наследуете AuthenticationCustomForm, отличается своеобразным методом __init__, который зачем-то первым после self аргументом принимает request. Хорошо хотя бы, что передавать его туда не обязательно. Попробуйте сделать так:

form = AuthenticationCustomForm(data=request.POST)

И кстати, при валидации там уже происходит вызов функции authenticate, результат которой сохраняется в специальной переменной и затем может быть получен через form.get_user()

Отредактировано pythonlove (Май 8, 2014 15:29:17)

Офлайн

#3 Май 8, 2014 17:06:05

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

Почему не работает унаследованная форма?

вот спасибо. заработало

Офлайн

  • Начало
  • » Django
  • » Почему не работает унаследованная форма?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version