2015-04-22 100 views
2

我做了一個自定義的註冊表單,它繼承了UserCreationForm。但是,當您嘗試提交時,如果其中一個字段爲空,我會根據需要獲得KeyError。 這似乎發生在django源代碼的某處,但我很確定它是因爲我的自定義清理方法。django用戶創建表單需要keyerror

形式:

class RegistrationForm(UserCreationForm): 
    """ 
    edit the User Registration form to add an emailfield 
    """ 

    class Meta: 
     model = User 
     fields = ('username', 'password1', 'password2') 

    def __init__(self, *args, **kwargs): 
     super(RegistrationForm, self).__init__(*args, **kwargs) 
     #add custom errormessages 
     self.fields['username'].error_messages = { 
     'invalid': 'Invalid username' 
     } 
     self.fields['password2'].label = "Confirm Password" 

    #make sure username is lowered and unique 
    def clean_username(self): 
     username = self.cleaned_data.get('username') 
     try: 
      User.objects.get(username__iexact=username) 
      raise forms.ValidationError("This username is already in use.") 
     except User.DoesNotExist: 
      pass 

     return username 

    def save(self, commit=True): 
     user = super(RegistrationForm, self).save(commit=False) 
     if commit: 
      user.save() 
     return user 

錯誤日誌http://pastebin.com/8Y6Tp7Rw

注:我使用Django 1.8

回答

2

你正在用你自己的字典替換所有'用戶名'字段的error_messages字典。相反,你應該更新error_messages字典與您的自定義消息,如下所示:

self.fields['username'].error_messages.update({ 
    'invalid': 'Invalid username' 
}) 
+0

這確實刪除了關鍵錯誤。沒有意識到我取代了所有的錯誤信息。謝謝 –

0

看起來你已經改變了原來的錯誤消息 '用戶名' 字段(你不加,但是壓倒一切):

#add custom errormessages 
self.fields['username'].error_messages = { 
    'invalid': 'Invalid username' 
} 

因此,當您將用戶名留空時,未能找到'必需'鍵。