Найти - Пользователи
Полная версия: Почему не работает унаследованная форма?
Начало » Django » Почему не работает унаследованная форма?
1
zlodiak
помогите пожалуйста исправить процесс авторизации.

я создаю форму 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”

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

form = AuthenticationCustomForm(data=request.POST)

И кстати, при валидации там уже происходит вызов функции authenticate, результат которой сохраняется в специальной переменной и затем может быть получен через form.get_user()
zlodiak
вот спасибо. заработало
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB