Django поднять формы ValidationError не работает - PullRequest
0 голосов
/ 09 марта 2019

Это может быть повторный вопрос, однако я не нашел решения для своей проблемы. Проблема связана с моей проверкой UserLoginForm. "поднять формы. ValidationError" не работает и не выдает ошибку. Все остальное отлично работает.

Блок проверки моей формы

    def clean(self):
        cleanedData= super(UserLoginForm, self).clean()
        username= cleanedData.get('username')
        password = cleanedData.get('password')

        if User.objects.filter(username=username).exists() is False:
            print("User not available Validation should trigger")
            raise forms.ValidationError('User does not exists.')
        else:
            user = authenticate(username=username, password=password)
            if user is None:
                print("Authentication Failed Validation should trigger")
                raise forms.ValidationError('Invalid Credentials.')

Views.py

def signin(request):
    if request.method == 'POST':
        form= UserLoginForm(request.POST)
        if form.is_valid():
            username= str(form.cleaned_data['username']).lower()
            password= form.cleaned_data['password']

            user= authenticate(username= username, password= password)
            if user:
                if user.is_active:
                    login(request, user)
                    return HttpResponseRedirect(reverse_lazy('testapp:index'))
                else:
                    return HttpResponse('User Not Active')
            else:
                return HttpResponse('Login Unsuccessful.')
        else:
            return HttpResponse('Form not valid')
    elif request.method == 'GET':
        if request.user.is_authenticated:
            return HttpResponseRedirect(reverse_lazy('testapp:index'))
        else:
            form= UserLoginForm()
    return render(request, 'signin.html', {'form': form})

HTML Temlplate

{% extends "base.html" %}
{% load static %}
{% block bodyblock %}
    <div class="container">
        <img src="{% static "images/face.png" %}" alt="image no found">
        <div class="heading">
            <h1>Login</h1>
        </div>
        <form action="" method="post" id="signinForm">
            {% csrf_token %}
            <div class="form-input">
                <i class="fas fa-user"></i>
                {{ form.username }}
            </div>
            {% if form.username.errors %}
                <span>{{ form.username.errors }}</span>
            {% endif %}
            <div class="form-input">
                <i class="fas fa-lock"></i>
                {{ form.password }}
            </div>
            {% if form.password.errors %}
                <span>{{ form.password.errors }}</span>
            {% endif %}

            {{ form.non_field_errors }}
            {{ form.source.errors }}
            {{ form.source }}

            <div class="form-submit">
                <input type="submit" value="Sign In">
            </div>
        </form>
    </div>
{% endblock bodyblock %}

Для отлова ошибок я использую все 3 ({{form.non_field_errors}}, {{form.source.errors}}, {{form.source}}) в своем HTML-шаблоне.

Я могу видеть "Пользователь недоступен, проверка должна сработать" и "Ошибка проверки подлинности должна сработать", но ошибка VailidationError не работает.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

В соответствии с предложением @Daniel Roseman, замена "return HttpResponse ('Form not valid')" на "return render (request, 'signin.html', {'form': form})" ", которая разрешила проблему.

0 голосов
/ 09 марта 2019
    # Validation
    def clean(self):
        cleaned_data = super(UserLoginForm, self).clean()
        username = cleaned_data.get("username")
        email = cleaned_data.get("email")
        email_exist = User.objects.filter(email=email).exists()
        username_exist = User.objects.filter(username=username).exists()

        if username_exist:
            raise forms.ValidationError('User Exists')
        else:
            raise forms.ValidationError('User does not exists')

        return super(UserProfileForm, self).clean()

Можете ли вы попробовать это?

...