Django - 奇怪的字典行为

时间:2014-03-08 10:06:02

标签: python django dictionary

我正在尝试覆盖Django表单中的默认错误消息:

class RegistrationForm(forms.Form):

    my_errors = {
        'required': 'To pole jest wymagane'
    }
    email = forms.EmailField(max_length=254, error_messages=my_errors.update({'invalid': 'Podaj prawidłowy adres e-mail'}))
    password = forms.CharField(error_messages=my_errors)
    firstname = forms.CharField(max_length=80, error_messages=my_errors)
    lastname = forms.CharField(max_length=80, error_messages=my_errors)

    def clean_email(self):
        email = self.cleaned_data['email']
        User = get_user_model
        try:
            User.objects.get(email=email)
            raise forms.ValidationError('Adres e-mail jest już zajęty')
        except User.DoesNotExist:
            return email

我可以轻松更改“必需”错误消息,因为每个字段都是相同的。

但对于电子邮件字段,我希望“无效”消息更具体,因此我将现有的dict与包含电子邮件错误消息的dict合并。

但它不起作用:电子邮件字段返回默认错误消息,而其余字段使用我的错误消息。

请解释为什么会发生以及如何解决,谢谢

1 个答案:

答案 0 :(得分:1)

dict.update就地修改了dict,并返回None。因此,在声明error_messages=None字段时,您将传递email

代码的另一个不良副作用是将"invalid"添加到my_errors,并在声明其余字段时传递扩展my_errors

您需要合并dicts而不是update,例如:

class RegistrationForm(forms.Form):

    my_errors = {
        'required': 'To pole jest wymagane'
    }
    email = forms.EmailField(max_length=254, error_messages=dict(my_errors, invalid='Podaj prawidłowy adres e-mail'))
    password = forms.CharField(error_messages=my_errors)
    ...