2014-01-22 16 views
0

我要改變「這是必須填寫」表單驗證錯誤信息包括字段的標籤,例如「名稱字段是必需的」。 Django是否提供了一種簡單的方式來引用錯誤消息中的字段屬性?如何field屬性值傳遞給Django的表單字段錯誤信息

errors = { 
    'required': _('{label} field is required') 
} 

class MyForm(forms.Form): 
    name = forms.CharField(label=_('Name'), error_messages=errors, max_length=80) 
    age = forms.IntegerField(label=_('Age'), error_messages=errors) 

我知道我可以重寫窗體的__init__方法來構建的錯誤消息,因爲我想,但我想一個更清潔的方式。

+0

沒了,很肯定你必須覆蓋'__init__' – Anentropic

+0

@Antropic你是不對的。看看默認的** Invalid_choice **消息:*選擇一個有效的選擇。 %(值)S不是可用選項之一*。 – niekas

+0

這與「字段是必需的」錯誤消息的情況不相關,該消息不採取任何格式化變量。但是我認爲覆蓋表單的'__init__'可能不是最好的方法 – Anentropic

回答

0

它可以使用Python字符串中的錯誤信息的格式,但你可能需要使用自定義Field子類。

爲您要自定義的特定錯誤消息 - 必填字段 - Django的Field類只是引發錯誤而沒有嘗試任何字符串替換:

def validate(self, value): 
    if value in validators.EMPTY_VALUES and self.required: 
     raise ValidationError(self.error_messages['required']) 

ValidationError沒有做任何要麼)

其他一些錯誤允許錯誤字符串一些特定的增值經銷商(找到他們只是搜索在django/forms/fields.pyraise ValidationError),但一個問題的Django已經給你你想要的是現場實例不知道自己的名字。除非你通過了kwarg,否則字段實例並不知道它的標籤,所以在引發異常的地方,Django沒有什麼可以給你的。

在你的情況,你在自定義標籤傳遞的所有領域,所以你可以嘗試以下的混入,以減輕使您需要的自定義字段類:

class RequiredErrorMsgMixin(object): 
    def validate(self, value): 
     if value in validators.EMPTY_VALUES and self.required: 
      raise ValidationError(
       self.error_messages['required'].format(label=self.label) 
      ) 

class CustomCharField(RequiredErrorMsgMixin, CharField): 
    pass 

class CustomIntField(RequiredErrorMsgMixin, IntField): 
    pass 

errors = { 
    'required': _('{label} field is required') 
} 

class MyForm(forms.Form): 
    name = CustomCharField(label=_('Name'), error_messages=errors, max_length=80) 
    age = CustomIntegerField(label=_('Age'), error_messages=errors) 
+0

是的,你是正確的,該實例默認情況下不能訪問錯誤消息。但是由於我加載了不同的字段,我選擇使用CustomFormMixin,它只是遍歷其'__init__''方法中的所有字段並更新消息:''field.error_messages ['required'] = _(error_message)。格式(field.label)''。 – niekas

相關問題