Форум сайта python.su
Доброго времени суток! Помогите, пожалуйста новичку.
Создаю простую форму для входа в систему:
class LoginForm(forms.ModelForm): password = forms.CharField(widget = forms.PasswordInput(), label = 'Your Password') class Meta: model = User fields = ('username', 'password')
class WelcomeView(View): http_method_names = ['get','post'] def get(self, request): template_name = 'Welcome.html' form = LoginForm() return render(request,template_name,{'form':form}) def post(self, request): logout(request) form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] user = authenticate(username = username, password = password) if user is not None: if user.is_active: login(request,user) return redirect('schedule') else: print('User is inactive') else: print('Invalid login') print(form.errors) else: print('Not valid!', form.errors) form = LoginForm() return reverse('welcome')
<p>Please, login to proceed...</p> {% if form.errors %} <p> Your username and password didn't math</p> {% endif %} <form name = "LoginForm"action = "{{action}}" method="post"> {% csrf_token %} {% if form.non_field_errors %} <div class="form_errors"> {% for err in form.non_field_errors %} <div class="form_error_message">{{ err }}</div> {% endfor %} </div> {% endif %} {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %} {% for field in form.visible_fields %} <div {% if field.errors %}class="field_error"{% endif %}> {{ field.label_tag }} {{ field }} {% for err in field.errors %} <span class="error_message">{{ err }}</span> {% endfor %} </div> {% endfor %} {% for i in form.errors %} {{ i }} {% endfor %} <input type="submit" value = "login"> </form>
Отредактировано demiurg (Ноя. 5, 2014 00:52:32)
Офлайн
Когда форма не валидна (т.е. c ошибками) вы должны ее передать обратно в template.
Офлайн
Когда форма не валидна (т.е. c ошибками) вы должны ее передать обратно в template.
Офлайн
demiurgПримерно так же как вы и до этого отправляли форму
return render(request,template_name,{'form':form})
return render(request,template_name,{'form':form})
Офлайн
form = LoginForm(request.POST) if form.is_valid(): ... return reverse('welcome') print('Not valid!', form.errors) # form = LoginForm() # Вот этого делать не надо, т.к. вы форму которая содержит ошибки затираете пустой формой return render(request,template_name,{'form':form})
Офлайн
Воспользовался вашим советом. Теперь ошибки выводятся, но не происходит авторизация. При введении правильных данных выдается сообщение об ошибке : “Пользователь с таким именем уже существует”.
Так же хотелось бы реализовать функционал сообщения о том что пользователь неактивный или введен неправильный пароль. Для этого необходимо переопределить методы в классе формы (если да, то как правильно?) или достаточно будет вызвать ошибку валидации в теле функции типа:
raise forms.ValidationError("This user is inactive!")
Отредактировано demiurg (Ноя. 5, 2014 16:33:01)
Офлайн
Для всех, кому может быть интересно или пригодится!
Вопрос решился следующим образом.
Код модели:
class LoginForm(forms.Form): username = forms.CharField(label = 'Your Name') password = forms.CharField(widget = forms.PasswordInput(), label = 'Your Password') def clean_username(self): username = self.cleaned_data['username'] try: user = User.objects.get(username = username) if not user.is_active: raise forms.ValidationError("User is inactive!") else: return username except User.DoesNotExist: raise forms.ValidationError("User not Exist!")
class WelcomeView(View): http_method_names = ['get','post'] def get(self, request): template_name = 'Welcome.html' form = LoginForm() print(form.errors) return render(request,template_name,{'form':form}) def post(self, request): logout(request) template_name = 'Welcome.html' form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] user = authenticate(username = username, password = password) if user is not None: if user.is_active: login(request,user) return redirect('schedule') else: print('User is inactive') else: print('Invalid login') print(form.errors) else: print('Not valid!', form.errors) return render(request, template_name,{'form':form})
return render(request, template_name,{'form':form})
Офлайн
А зачем так издеваться?
Если свой шаблон хочется использовать, то можно проще поступить.
# views.py from django.contrib.auth import views as auth_views def login_view(request): if request.user.is_authenticated(): return HttpResponseRedirect('/') return auth_views.login(request, template_name='profiles/login.html') # urls.py ... url(r'^login/$', login_view, name='login'), ...
Отредактировано den4ik (Ноя. 17, 2014 18:50:12)
Офлайн