1

ModelForm を使用してフォームを作成しています。一意のフィールドの検証という1つのことを除いて、すべて正常に機能します。コード:

class Article(models.Model):
...
title = models.CharField(max_length=255, unique=True, error_messages={'max_length' : 'max translation',
                                                                                                    'unique' : 'unique translation',
                                                                                                    'required' : 'req translation',})
...

class ArticleForm(ModelForm):
...
title = forms.CharField(max_length=255, min_length=3, error_messages={'required' : 'req translation',
                                                                                             'min_length' : 'min translation',
                                                                                             'max_length' : 'max translation',
                                                                                             'unique' : 'unique translation',}) 

しかし、一意でないタイトルでフォームを保存すると、カスタム翻訳エラーは表示されませんが、デフォルト エラーが表示されます。固有のフィールド エラーが表示されるのを修正するにはどうすればよいですか?

編集: それを行うための非常に便利な方法を見つけたと思います。多分誰かがそれを使うでしょう:)

def unique_error_message(self, model_class, unique_check):
    if 'put_field_name_here' in unique_check and len(unique_check) == 1:
        return 'Here goes a custom unique error'

    return super(Article, self).unique_error_message(model_class, unique_check)
4

1 に答える 1

1

unique検証メッセージをカスタマイズするためのキーはありません。カスタマイズする価値はないと思いますが、必要な場合は、次のアプローチが役立ちます。

import re
class ArticleForm(ModelForm):
    def clean(self, *args, **kwargs):
       result = super(ArticleForm, self).clean(*args, **kwargs)
       if self.non_field_errors:
           for i,msg in enumerate(self.non_field_errors):
               if re.match("^.+ already exists\.$", msg):
                   self.errors["__all__"][i] = custom_msg # Put your own text here
       return result

このソリューションは、文書化されていないDjangoの内部に依存していますが、今のところうまくいくはずです。繰り返しますが、私の推奨事項はデフォルトを維持することです。

于 2011-01-04T01:47:40.407 に答える