forms.py:
from django import forms
from django.contrib.auth import authenticate, get_user_model, login
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.utils.text import capfirst
from .models import Classname, Sectionname, Teachername, Attendancename
class AuthenticationForm(forms.Form):
username = forms.CharField(max_length=20)
password = forms.CharField(widget=forms.PasswordInput)
error_messages = {
'invalid_login': ("Please enter a correct %(username)s and password."
"Note that both fields may be case-sensitive."),
'inactive': ("This account is inactive"),
}
def clean(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if username and password:
self.user_cache = authenticate(username=username, password=password)
if self.user_cache is None:
raise forms.ValidationError(
self.error_messages['invalid_login'],
code='invalid_login',
)
return self.cleaned_data
def confirm_login_allowed(self, request):
if self.user_cache.is_active:
login(request, self.user_cache)
else:
raise forms.ValidationError(
self.error_messages['inactive'],
code='inactive',
)
def get_user_id(self):
if self.user_cache:
return self.user_cache.id
return None
def get_user(self):
return self.user_cache
views.py:
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(request.POST)
if form.is_valid():
form.confirm_login_allowed(request)
return HttpResponseRedirect(reverse('student:mains'))
else:
print(form.errors)
else:
form = AuthenticationForm()
return render(request, 'login.html', {'form': form},)
我的模板:
<!DOCTYPE html>
<html>
<head>
<!-- Is anyone getting tired of repeatedly entering the header over and over?? -->
<title>Login</title>
</head>
<body>
<h1>Login to Mysite</h1>
<form id="login_form" method="post">
{% csrf_token %}
Username: <input type="text" name="username" value="" size="50" />
<br />
Password: <input type="password" name="password" value="" size="50" />
<br />
<br>
<input type="submit" value="submit" />
</form>
</body>
</html>
我正在研究django-auth表单和视图,并尝试在我当前的小应用程序上实现。一切正常,除非我提供不正确的凭据,然后表单不会引发任何错误。
尽管如此,它仍然在相同的登录页面上没有任何适当的消息。
但是,我已在表单的'raise ValidatonError'
方法中定义了'confirm_login_allowed'
,在我的视图中也定义了'print(form.errors)'
。
我不知道为什么它没有显示适当的消息。
任何人都可以知道我在哪里做错了吗?
谢谢!提前.....
答案 0 :(得分:0)
看起来你从未在模板中使用{'form':form},而是选择手动构建两个输入。这实际上可以启动您在身份验证方面所需的所有后端进程,因为您已将每个表单元素的名称值分配为与AuthenticationForm中的变量(即用户名,密码)相对应。所以一切都在POST上有效。但是在GET上,你实际上从未使用过form.error_message,因此没有地方可以显示它,即使它被分配了一个值。