Как я могу решить эту ошибку KeyError

enter image description here

Как это решить??? Что-то не так? Я новичок в Django... Заранее спасибо

попробуйте это

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-я обязательно исправят эту ошибку с ключом

Для получения дополнительной информации я настоятельно рекомендую ознакомиться с документацией, 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")

Добрый день!

Возможно, в шаблоне HTML есть ошибка с отсутствующим полем user_email в <form>.

# 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

Поскольку вы используете square скобки [] для keys, это приведет к выбросу KeyError, если этого key не существует в ваших all_data

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 if exists в вашем all_data as

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')
Вернуться на верх