2014-11-27 4 views
2

У меня есть форма, которая выглядит следующим образом:Django формы - cleaned_data KeyError

class AForm(forms.ModelForm): 
    email1 = forms.EmailField(required=False, initial='') 
    email2 = forms.EmailField(required=False) 

    class Meta: 
     model = AModel 
     fields =() 

    def clean_email1(self): 
     return self.cleaned_data['email1'].lower() 

    def clean_email2(self): 
     return self.cleaned_data['email2'].lower() 

    def clean(self): 
     cleaned_data = super(AForm, self).clean() 
     email1 = cleaned_data['email1'] # ERR 
     email2 = cleaned_data['email2'] 
     # ... 

Он используется в методе вид post следующим образом:

form = AForm(request.POST, instance=self.object) 
if forms.is_valid(): 
    # ... 
else: 
    # ... 

Это случается иногда, что мой пользователи производят KeyError в clean по строке, обозначенной ERR.

Я не понимаю, как это возможно, поскольку, as the documentation reads, cleaned_data должен содержать (как ключи от ключа) все поля формы.

Также я не могу воспроизвести ошибку, когда я пробовал посылку ничего для email1 и email2 (или пустые/пустые значения).

Что мне здесь не хватает?

+0

Поскольку я перечитываю документацию, я понимаю, что это означает, что 'cleaned_data' должен включать все ключи ** после' form.is_valid() '** (я еще не просмотрел код, когда точно он заполнен всеми клавишами). Тем не менее, мне интересно, как воспроизвести ошибку – lajarre

+0

Является ли это опечаткой? cleaned_data = super (PUWForm_fwd, self) .clean() Название класса - AForm. –

+0

@JonS. right, typo – lajarre

ответ

2

Вы явно указали email1 как требуется = False. Это означает, что вполне возможно получить чистку без значения для этого поля, и в этом случае он не будет включен в файл cleaned_data dict.

Чтобы защититься от этого, вы можете использовать обычный ДИКТ get метод:

email1 = cleaned_data.get('email1') 

или, конечно, вы могли бы сделать обязательно поле.

+0

А как насчет того, что написано по ссылке на django doc, о котором я упоминал в вопросе? – lajarre

Смежные вопросы