2

我在修复登录表单时遇到了困难。我面临的问题是每当用户提交表单而不输入电子邮件或登录时,我都会收到此错误。我该如何解决这个问题?

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']

表格.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

视图.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>     
4

2 回答 2

3
File "C:\o\17\mysite\pet\forms.py" in authenticate_via_email
62.                 email = self.cleaned_data['email']

您正在访问字典中不存在的元素。尝试这个:

email = self.cleaned_data.get('email', None)
if email:
    (...)
return None
于 2013-05-20T17:21:13.733 回答
1
def clean(self):
    cleaned_data = super(LoginForm, self).clean()
    if self._errors:
       return cleaned_data
    ...

轻松解决此类问题。如果该字段是必需的,您可以期望密钥在那里

于 2013-05-20T17:44:18.210 回答