【问题标题】:How can I solve this KeyError我该如何解决这个 KeyError
【发布时间】:2022-01-26 05:35:16
【问题描述】:

如何解决这个问题?有什么问题吗?? 我是 Django 的新手... 提前致谢

【问题讨论】:

标签: django django-forms keyerror


【解决方案1】:

美好的一天!

可能是模板 HTML 中有错误,<form> 中缺少 user_email 字段。

# form.py
from django import forms
from django.core import validators


class UserForm(forms.Form):
    user_email = forms.EmailField()
    user_vmail = forms.EmailField()

    def clean(self):
        all_data = super().clean()
        print(all_data)
        user_email = all_data["user_email"]
        user_vmail = all_data["user_vmail"]

        if user_email != user_vmail:
            raise forms.ValidationError("Email does not match")

这给出了以下内容:

[26/Jan/2022 05:57:32] "GET / HTTP/1.1" 200 3702
{'user_email': 'asd@asd.asd', 'user_vmail': 'asd@asd.asd'}
[26/Jan/2022 05:57:43] "POST / HTTP/1.1" 302 0
[26/Jan/2022 05:57:43] "GET / HTTP/1.1" 200 3702

源码:https://github.com/almazkun/django_form

【讨论】:

    【解决方案2】:

    有关更多信息,我强烈建议您查看文档,https://docs.djangoproject.com/en/4.0/ref/forms/validation/#form-field-default-cleaning

    def clean(self):
        cleaned_data = super().clean()
        user_email= cleaned_data.get("user_email")
        user_vmail = cleaned_data.get("user_vmail")
    

    【讨论】:

      【解决方案3】:

      试试这个

      user_email = all_data.get('user_email')
      
      user_vmail = all_data.get('user_vmail')
      

      或者这个

      user_email = self.all_data.get('user_email')
      
      user_vmail = self.all_data.get('user_vmail')
      

      第 1 次或第 2 次肯定会修复该关键错误

      【讨论】:

      • all_data是局部变量,与self无关
      【解决方案4】:

      由于您使用square 括号[] 表示keys,如果key 在您的all_data 中不存在,它将抛出KeyError

      class user_form(forms.Form):
          user_email = forms.EmailField()
          user_vmail = forms.EmailField()
      
          def clean(self):
              all_data = super().clean()
              user_email = all_data['user_email'] #<---- throws key error if 'user_email' not in all_data
              user_vmail = all_data['user_vmail'] #<---- throws key error if 'user_vmail' not in all_data
      
              if user_email != user_vmail:
                  raise forms.ValidationError("Email Doesn't match")
      

      所以为了避免KeyError 检查key 是否存在于您的all_data

      class user_form(forms.Form):
          user_email = forms.EmailField()
          user_vmail = forms.EmailField()
      
          def clean(self):
              all_data = super().clean()
              if not ('user_email' in all_data.keys() and 'user_vmail' in all_data.keys()):
                  raise forms.ValidationError("Please fill all fields.")
          
              user_email = all_data['user_email']
              user_vmail = all_data['user_vmail']
      
              if user_email != user_vmail:
                  raise forms.ValidationError("Email Doesn't match")
      

      或者为了避免KeyError使用()作为

      user_email = all_data('user_email')
      user_vmail = all_data('user_vmail')
      

      【讨论】:

        猜你喜欢
        • 2015-07-26
        • 1970-01-01
        • 2021-01-09
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2021-06-29
        • 2020-03-25
        • 2016-09-09
        相关资源
        最近更新 更多