Это может быть повторяющийся вопрос, однако я не нашел решения для своей проблемы. Проблема связана с моей проверкой 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-шаблон
{% 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 не работает.
@Daniel Roseman Добавил представление
Но вы никогда не визуализируете шаблон снова после публикации. Итак, где вы ожидаете, что эти ошибки будут отображаться?
Добавлен HTML-шаблон, не могли бы вы подсказать, как и где я должен отобразить ошибку. Я уже использую ту же структуру на странице регистрации, она работает для этого блока, но не для блока входа.
@KartikPunde, для какого поля в форме вы хотите добавить проверки
Шаблон нет проблема. По вашему мнению, когда форма недействительна, все, что вы делаете, это делаете return HttpResponse('Login Unsuccessful.'). Таким образом, вы будете никогда не видел этого шаблона с отображаемыми ошибками. Чего вы ожидаете?
@DanielRoseman Большое спасибо. Заменено «возврат HttpResponse («Форма недействительна»)» на «возврат рендеринга (запрос, 'signin.html', {'форма': форма})», что решило проблему.






# 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()
Вы можете попробовать это?
По-прежнему не выбрасываются формы. ValidationError.
Как предложил @Daniel Roseman, «return HttpResponse («Форма недействительна»)» заменен на «return render (request, 'signin.html', {'form': form})», что решило проблему.
Пожалуйста, покажите вид.