Python 在/登录时出现密钥错误/
我很难修改我的登录表单。我面临的问题是,每当用户未输入电子邮件或登录而提交表单时,我就会收到此错误。我如何解决这个问题Python 在/登录时出现密钥错误/,python,django,Python,Django,我很难修改我的登录表单。我面临的问题是,每当用户未输入电子邮件或登录而提交表单时,我就会收到此错误。我如何解决这个问题 KeyError at /login/ emailRequest Method: POST Request URL: http://127.0.0.1:8000/login/ Django Version: 1.4.3 Exception Type: KeyError Exception Value: email Traceback: File "C:\Pyt
KeyError at /login/
emailRequest Method: POST
Request URL: http://127.0.0.1:8000/login/
Django Version: 1.4.3
Exception Type: KeyError
Exception Value: email
Traceback:
File "C:\Python26\lib\site-packages\django\core\handlers\base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "C:\o\17\mysite\pet\views.py" in LoginRequest
207. if request.POST and form.is_valid():
File "C:\Python26\lib\site-packages\django\forms\forms.py" in is_valid
124. return self.is_bound and not bool(self.errors)
File "C:\Python26\lib\site-packages\django\forms\forms.py" in _get_errors
115. self.full_clean()
File "C:\Python26\lib\site-packages\django\forms\forms.py" in full_clean
271. self._clean_form()
File "C:\Python26\lib\site-packages\django\forms\forms.py" in _clean_form
299. self.cleaned_data = self.clean()
File "C:\o\17\mysite\pet\forms.py" in clean
47. user = self.authenticate_via_email()
File "C:\o\17\mysite\pet\forms.py" in authenticate_via_email
62. email = self.cleaned_data['email']
forms.py
class LoginForm(forms.Form):
email = forms.CharField()
password = forms.CharField(
widget=forms.PasswordInput(render_value=False)
)
def clean(self):
user = self.authenticate_via_email()
if not user:
raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
else:
self.user = user
return self.cleaned_data
def authenticate_user(self):
return authenticate(
username=self.user.username,
password=self.cleaned_data['password'])
def authenticate_via_email(self):
email = self.cleaned_data['email']
if email:
try:
user = User.objects.get(email__iexact=email)
if user.check_password(self.cleaned_data['password']):
return user
except ObjectDoesNotExist:
pass
return None
views.py
def LoginRequest(request):
form = LoginForm(request.POST or None)
if request.method == 'POST' and form.is_valid():
user = form.authenticate_user()
login(request, user)
return HttpResponseRedirect(reverse('Hello'))
return render(request, 'login.html',{'form': form})
模板
<form method="POST">
{% csrf_token %}
{{form.email}}{{form.email.errors}}
{{form.password}}{{form.password.errors}}
<input type = "submit" value = "Login" id="submit" />
</form>
{%csrf_令牌%}
{{form.email}{{form.email.errors}}
{{form.password}{{form.password.errors}}
您正在访问字典中不存在的元素。试试这个:
email = self.cleaned_data.get('email', None)
if email:
(...)
return None
您正在访问字典中不存在的元素。试试这个:
email = self.cleaned_data.get('email', None)
if email:
(...)
return None
很容易解决这类问题。如果该字段是必需的,则可以预期该键在那里
很容易解决这类问题。如果该字段为必填字段,您可以预期该键在那里您是否可以从django stacktrace打印
请求。POST
,或打印已清理的\u数据,并检查此字段中是否存在电子邮件dict@Srikar骇人听闻的,我发布了所有跟踪您是否可以打印出请求。从django stacktrace?发布,或打印已清理的\u数据,并检查此文件中是否存在电子邮件dict@Srikar令人震惊的是,我发布了所有的traceoh,但是没有返回怎么办?@Jackloster我已经更新了我的答案。代码与您的代码完全相同(如果逻辑正确),您只需更改[“field”]即可获取(“field”)。谢谢Salmen,嗯,我可以问一下[“field”]和获取(“field”)之间的区别吗?区别在于,如果找不到键,则使用键作为索引会引发异常(KeyError
)。使用get
,如果键不存在,则返回您指定为第二个参数的值(如果不传递任何值,则返回无)。这很好,我不知道您可以这样做。哦,但是返回无值呢?@JackRoster我已更新了我的答案。代码与您的代码完全相同(如果逻辑正确),您只需更改[“field”]即可获取(“field”)。谢谢Salmen,嗯,我可以问一下[“field”]和获取(“field”)之间的区别吗?区别在于,如果找不到键,则使用键作为索引会引发异常(KeyError
)。使用get
,如果键不存在,则返回指定为第二个参数的值(如果不传递任何值,则返回无)。这很好,我不知道您可以这样做。
def clean(self):
cleaned_data = super(LoginForm, self).clean()
if self._errors:
return cleaned_data
...