{"title":"フォームとフィールドの検証","version":"2.1","locale":"ja","docname":"ref/forms/validation","url":"/ja/2.1/ref/forms/validation/","canonical":"https://djangodocs.dev/ja/2.1/ref/forms/validation/","summary":"フォームのバリデーションは、データがクリーニング (clean) されるときに実行されます。このプロセスをカスタムしたい場合は、様々な箇所に変更を加えることができ、それぞれが違う目的を持っています。クリーニング方法のうち 3 タイプは、フォームのプロセス中に実行されます。これらは、通常フォーム上の is_valid()…","html":"<h1>フォームとフィールドの検証<a class=\"heading-anchor\" href=\"#form-and-field-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>フォームのバリデーションは、データがクリーニング (clean) されるときに実行されます。このプロセスをカスタムしたい場合は、様々な箇所に変更を加えることができ、それぞれが違う目的を持っています。クリーニング方法のうち 3 タイプは、フォームのプロセス中に実行されます。これらは、通常フォーム上の <code class=\"docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code> メソッドを呼び出したときに実行されます。このほかにも、クリーニングとバリデーションのトリガーとなる処理 (直接 <code class=\"docutils literal notranslate\"><span class=\"pre\">errors</span></code> 属性にアクセスしたり、 <code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> を直接呼び出す) がありますが、通常必要とはなりません。</p>\n<p>一般的に、あらゆるクリーニング方法は <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を投げる可能性があります。処理されるデータに問題がある場合、関連情報を <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> コンストラクタに渡します。<a class=\"reference internal\" href=\"#raising-validation-error\"><span class=\"std std-ref\">下記項目</span></a> に、<code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を投げる際のベストプラクティスがあります。<code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> が投げられない場合、メソッドはクリーニングされた (標準化された) データを Python オブジェクトとして返すはずです。</p>\n<p>大半のバリデーションは、<a class=\"reference internal\" href=\"#validators\">validators</a> を使って行うことができます- シンプルなヘルパーで、再利用も簡単です。バリデータはシンプルな関数 (ないしカラブル) で、単一の引数を取り無効な入力において <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を投げます。 バリデータは、フィールド <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">validate</span></code> メソッドが呼び出された後に実行されます。</p>\n<p>フォームのバリデーションは複数のステップに分割されます。カスタムやオーバーライドすることができます:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> メソッドはすべてのバリデーションの最初のステップとなります。これは、値をデータ型に正すことを強制し、それができない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を投げます。このメソッドはウィジェットからそのままの値を受け取り、変換した値を返します。たとえば、<code class=\"docutils literal notranslate\"><span class=\"pre\">FloatField</span></code> は Python の <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code> に変換されるか、もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を投げます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">validate()</span></code> メソッドは、フィールド特有のバリデーションを行います。これはバリデータとしては不適です。正しいデータ型を強制された値を取り、エラーの際は <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を投げます。このメソッドは何も返さず、また値の変更も行わないはずです。バリデータに記述したくないバリデーションロジックを実行するためには、このメソッドをオーバーライドしてください。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">run_validators()</span></code> メソッドはフィールドのバリデータをすべて実行し、すべてのエラーを単一の <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> に統合します。このメソッドをオーバーライドする必要はないはずです。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> サブクラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドは、<code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">validate()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">run_validators()</span></code> を正しい順序で実行し、エラーを伝達する役目を負っています。もしこの過程のどこかで <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> が投げられた場合、バリデーションは停止し、そのエラーを投げます。このメソッドはクリーニングされたデータを返し、フォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> ディクショナリに格納します。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">clean_&lt;fieldname&gt;()</span></code> メソッドは、フォームサブクラス上で呼び出されます -- <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;fieldname&gt;</span></code> がフォームのフィールド属性の名前と置き換えられます。このメソッドは、フィールドのタイプにかかわらず、その特定の属性に対するクリーニングを実行します。 このメソッドはパラメータを受け取りません。<code class=\"docutils literal notranslate\"><span class=\"pre\">self.cleaned_data</span></code> 内のフィールドの値を検索する必要があり、またこの時点ではフォーム上で元々送信された文字列ではなく Python オブジェクトであること覚えておいてください (これは <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> 内にあります。上記に出てきた一般フィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドがすでに一度データをクリーニングしているからです)。</p>\n<p>たとえば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">serialnumber</span></code> と呼ばれる <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> の内容がユニークであることをバリデートしたいとき、 <code class=\"docutils literal notranslate\"><span class=\"pre\">clean_serialnumber()</span></code> が最も適切な場所となり得ます。 特定のフィールド (この場合 <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>) は必要ありませんが、フォームのフィールドに紐付いたバリデーションと、おそらくデータのクリーニングおよび標準化も必要となるでしょう。</p>\n<p>このメソッドの戻り値は <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> 内の既存の値を置き換えるため、(たとえこのメソッドが変更しなかったとしても) <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> からのフィールドの値、ないし新しくクリーニングされた値になるはずです。</p>\n</li>\n<li><p>フォームのサブクラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">crean()</span></code> メソッドは、複数のフォームフィールドにまたがるバリデーションにも使用できます。この場所には、たとえば「フィールド <code class=\"docutils literal notranslate\"><span class=\"pre\">A</span></code> が入力されたときフィールド <code class=\"docutils literal notranslate\"><span class=\"pre\">B</span></code> は有効なメールアドレスのはず」といったチェックを記述できます。このメソッドは、必要な場合はまったく違うディクショナリを返すこともでき、その場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> として使用されます。</p>\n<p>フィールドバリデーションのメソッドは <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> が呼ばれる際に実行されるので、フォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">errors</span></code> 属性にもアクセスできるようになります。これは各フィールドのクリーニングによって発生した例外をすべて含みます。</p>\n<p><a class=\"reference internal\" href=\"/ja/2.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.clean()</span></code></a> をオーバーライドして発生させた例外は、特定のフィールドに結びつかない点に注意してください。これらは特別な &quot;フィールド&quot; (<code class=\"docutils literal notranslate\"><span class=\"pre\">__all__</span></code> と呼ばれます) に格納され、必要に応じて <a class=\"reference internal\" href=\"/ja/2.1/ref/forms/api/#django.forms.Form.non_field_errors\" title=\"django.forms.Form.non_field_errors\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">non_field_errors()</span></code></a> メソッドを通じてアクセスできます。特定のフィールドにエラーを紐付けて格納したい場合は、<a class=\"reference internal\" href=\"/ja/2.1/ref/forms/api/#django.forms.Form.add_error\" title=\"django.forms.Form.add_error\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add_error()</span></code></a> を呼び出す必要があります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> サブクラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドをオーバーライドする際、特に考慮する点がまだあります (詳しくは <a class=\"reference internal\" href=\"/ja/2.1/topics/forms/modelforms/#overriding-modelform-clean-method\"><span class=\"std std-ref\">ModelForm ドキュメント</span></a>  を参照してください)。</p>\n</li>\n</ul>\n<p>これらのメソッドは、一度に一つのフィールドに対し、先述した通りの順番で実行されます。フォーム内の各フィールドに対して (フォームの定義時に宣言された順序で)、<code class=\"docutils literal notranslate\"><span class=\"pre\">Field.clean()</span></code> メソッド (ないしそのオーバーライド) が実行され、その後 <code class=\"docutils literal notranslate\"><span class=\"pre\">clean_&lt;fieldname&gt;()</span></code> が実行されます。最後に、この 2 つのメソッドが全フィールドに対して実行された後、これらのメソッドでエラーが発生したかどうかにかかわらず <a class=\"reference internal\" href=\"/ja/2.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.clean()</span></code></a> メソッド (ないしそのオーバーライド) が実行されます。</p>\n<p>各メソッドの例は後述します。</p>\n<p>上述の通り、どのメソッドでも <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> が発生する可能性があります。どのフィールドに対しても、<code class=\"docutils literal notranslate\"><span class=\"pre\">Field.clean()</span></code> メソッドが <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を発生させた場合、フィールド特有のクリーニングメソッドは呼ばれません。一方で、すべての残りのフィールドに対するクリーニングメソッドは呼び出されます。</p>\n<section id=\"raising-validationerror\">\n<span id=\"raising-validation-error\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を発生させる<a class=\"heading-anchor\" href=\"#raising-validationerror\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>エラーメッセージを柔軟かつ簡単にオーバーライドできるようにするため、以下のガイドラインを検討してください:</p>\n<ul>\n<li><p>説明のための <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> をコンストラクタに渡します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Good</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value&#39;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s1\">&#39;invalid&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n</li>\n<li><p>メッセージには変数を強制しません; プレースホルダとコンストラクタの <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 引数を使用します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Good</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n    <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;value&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;42&#39;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value: </span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">value</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>位置指定ではなく、マッピングキーを使います。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Good</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n    <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;value&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;42&#39;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n    <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value: </span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;42&#39;</span><span class=\"p\">,),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>メッセージを <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> でラップし、翻訳できるようにします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Good</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value&#39;</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># Bad</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n</ul>\n<p>全てを一緒に記述すると以下のようになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n    <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s1\">&#39;invalid&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;value&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;42&#39;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>再利用可能なフォーム、フォームフィールド、モデルフィールドを記述した場合、特にこのガイドラインの遵守が必要となります。</p>\n<p>推奨はされませんが、バリデーションチェーンの最後で (例えばフォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッド) エラーメッセージのオーバーライドを <em>決してしない</em> ことが確かな場合は、より簡潔に記述することもできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value: </span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">value</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/2.1/ref/forms/api/#django.forms.Form.errors.as_data\" title=\"django.forms.Form.errors.as_data\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.errors.as_data()</span></code></a> や <a class=\"reference internal\" href=\"/ja/2.1/ref/forms/api/#django.forms.Form.errors.as_json\" title=\"django.forms.Form.errors.as_json\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.errors.as_json()</span></code></a> メソッドは、十分な機能を有する (<code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> 名と <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> ディクショナリを持つ) <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> により大きな恩恵を受けます。</p>\n<section id=\"raising-multiple-errors\">\n<h3>複数のエラーを起こす<a class=\"heading-anchor\" href=\"#raising-multiple-errors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>クリーニングメソッド内で複数のエラーを検証し、すべてのエラーをフォーム送信者に知らせたい場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> コンストラクタにエラーのリストを引き渡すことが可能です。</p>\n<p>上述の通り、<code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> インスタンスには <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> を渡すことが推奨されていますが、文字列のリストも使うことができます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Good</span>\n<span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">([</span>\n    <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Error 1&#39;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s1\">&#39;error1&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Error 2&#39;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s1\">&#39;error2&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">])</span>\n\n<span class=\"c1\"># Bad</span>\n<span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">([</span>\n    <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Error 1&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Error 2&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">])</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"using-validation-in-practice\">\n<h2>実際にバリデーションを使用する<a class=\"heading-anchor\" href=\"#using-validation-in-practice\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>前のセクションでは、フォームに対する検証が一般にどのように働くかを説明しました。実際の使われ方を見た方が機能をよく理解できるということが往々にしてあります。ここでは、説明した各機能を使った一連の小さな使用例を説明します。</p>\n<section id=\"using-validators\">\n<span id=\"validators\"></span><h3>バリデータを使う<a class=\"heading-anchor\" href=\"#using-validators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django のフォーム (とモデル) のフィールドは、バリデータと呼ばれるシンプルなユーティリティ関数とクラスの使用をサポートしています。バリデータはただのカラブルオブジェクトか関数で、値を取って、値が有効な場合は何も返さず、無効な場合は <a class=\"reference internal\" href=\"/ja/2.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a> を返します。フィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">validators</span></code> 引数を通してフィールドのコンストラクタに渡すことができます。もしくは、<a class=\"reference internal\" href=\"/ja/2.1/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> クラス自身で <code class=\"docutils literal notranslate\"><span class=\"pre\">default_validators</span></code> 属性を使って定義できます。</p>\n<p>シンプルなバリデータはフィールドの内部で値を検証するために使用できます。Django の <code class=\"docutils literal notranslate\"><span class=\"pre\">SlugField</span></code> を見てみましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">validators</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CharField</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SlugField</span><span class=\"p\">(</span><span class=\"n\">CharField</span><span class=\"p\">):</span>\n    <span class=\"n\">default_validators</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">validators</span><span class=\"o\">.</span><span class=\"n\">validate_slug</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>見ての通り、<code class=\"docutils literal notranslate\"><span class=\"pre\">SlugField</span></code> はカスタマイズされたバリデータを伴う <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> で、このバリデータは送信されたテキストがいくつかの文字列ルールに従うかどうかを検証します。これはフィールド定義においても実装可能です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">slug</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">SlugField</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>これは以下と同じです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">slug</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">validators</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">validators</span><span class=\"o\">.</span><span class=\"n\">validate_slug</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>一般的なケース (例えば、E メールや正規表現に対する検証) は、Django が提供する既存のバリデータクラスを使って処理できます。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">validators.validate_slug</span></code> は <a class=\"reference internal\" href=\"/ja/2.1/ref/validators/#django.core.validators.RegexValidator\" title=\"django.core.validators.RegexValidator\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RegexValidator</span></code></a> の第 1 引数をパターン <code class=\"docutils literal notranslate\"><span class=\"pre\">^[-a-zA-Z0-9_]+$</span></code> としたインスタンスです。<a class=\"reference internal\" href=\"/ja/2.1/ref/validators/\"><span class=\"doc\">バリデータを記述する</span></a> のセクションを参照して、利用可能なバリデータのリストとバリデータの記述方法の例を確認できます。</p>\n</section>\n<section id=\"form-field-default-cleaning\">\n<h3>フォームフィールドのデフォルトのクリーニング<a class=\"heading-anchor\" href=\"#form-field-default-cleaning\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>まず、カンマで区切られたメールアドレスを含むかどうか検証するカスタムフォームフィールドを作成しましょう。クラスの全体像は以下のようになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.validators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">validate_email</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MultiEmailField</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Normalize data to a list of strings.&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Return an empty list if no input was given.</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">value</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[]</span>\n        <span class=\"k\">return</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s1\">&#39;,&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">validate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Check if value consists only of valid emails.&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Use the parent&#39;s handling of required fields, etc.</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">validate</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n        <span class=\"k\">for</span> <span class=\"n\">email</span> <span class=\"ow\">in</span> <span class=\"n\">value</span><span class=\"p\">:</span>\n            <span class=\"n\">validate_email</span><span class=\"p\">(</span><span class=\"n\">email</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>このフィールドを使うすべてのフォームでは、フィールドのデータを使えるようになる前に、これらのメソッドが実行されます。これはこのタイプのフィールドに特有であり、それはこの後の使われ方には関係ありません。</p>\n<p>シンプルな <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code> を作って、このフィールドをどのように使うか見てみましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">subject</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n    <span class=\"n\">sender</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">EmailField</span><span class=\"p\">()</span>\n    <span class=\"n\">recipients</span> <span class=\"o\">=</span> <span class=\"n\">MultiEmailField</span><span class=\"p\">()</span>\n    <span class=\"n\">cc_myself</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">required</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>他のフォームフィールドと同様に <code class=\"docutils literal notranslate\"><span class=\"pre\">MultiEmailField</span></code> を使用してください。フォーム上で <code class=\"docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code> が呼び出されたとき、 クリーニングプロセスの一環として <code class=\"docutils literal notranslate\"><span class=\"pre\">MultiEmailField.clean()</span></code> メソッドが実行され、<code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">validate()</span></code> を順番に呼び出します。</p>\n</section>\n<section id=\"cleaning-a-specific-field-attribute\">\n<h3>特定のフィールド属性をクリーニングする<a class=\"heading-anchor\" href=\"#cleaning-a-specific-field-attribute\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>上の例を引き続き使用して、<code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">recipients</span></code> フィールドが常に``&quot;<a class=\"reference external\" href=\"mailto:fred&#37;&#52;&#48;example&#46;com\">fred<span>&#64;</span>example<span>&#46;</span>com</a>&quot;`` を含むようにしたいとします。これはフォームに特有のバリデーションなので、<code class=\"docutils literal notranslate\"><span class=\"pre\">MultiEmailField</span></code> クラスには記述したくありません。代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">recipients</span></code> フィールドで動作するクリーニングメソッドを記述します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Everything as before.</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean_recipients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"p\">[</span><span class=\"s1\">&#39;recipients&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"s2\">&quot;fred@example.com&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">data</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"s2\">&quot;You have forgotten about Fred!&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Always return a value to use as the new cleaned data, even if</span>\n        <span class=\"c1\"># this method didn&#39;t change it.</span>\n        <span class=\"k\">return</span> <span class=\"n\">data</span>\n</code></pre></div>\n</section>\n<section id=\"cleaning-and-validating-fields-that-depend-on-each-other\">\n<span id=\"validating-fields-with-clean\"></span><h3>互いに依存するフィールドをクリーニングして検証する<a class=\"heading-anchor\" href=\"#cleaning-and-validating-fields-that-depend-on-each-other\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>コンタクトフォームに新たな要件を追加することを考えます: <code class=\"docutils literal notranslate\"><span class=\"pre\">cc_myself</span></code> フィールドが <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code> には必ず <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;help&quot;</span></code> という言葉が含まれるという要件です。この場合、複数のフィールドにまたがったバリデーションを行うので、フォームの <a class=\"reference internal\" href=\"/ja/2.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clean()</span></code></a> メソッドで行うのが適切です。ここで注意すべきなのは、今扱っているのはフォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドであり、上記で扱ってきたフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> ではないということです。バリデーションを記述すする場所を決める際は、フィールドとフォームの違いを明確にすることが重要です。 フィールドは単一のデータポイントであり、フォームはフィールドの集まりです。</p>\n<p>フォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドが呼び出されるまでに、個別のフィールドのクリーンメソッドが呼び出されているので (上記 2 つのセクションで見た通りです)、<code class=\"docutils literal notranslate\"><span class=\"pre\">self.cleaned_data</span></code> にはこれまでのクリーニングで生き残ったデータが格納されています。したがって、検証しようとしているフィールドが、この個別フィールドのチェックを生き残っていない可能性を考慮する必要があります。</p>\n<p>この段階でのエラーを通知するには 2 つの方法があります。おそらく最も一般的な方法は、フォームのトップでエラーを表示する方法です。このようなエラーを生成するには、<code class=\"docutils literal notranslate\"><span class=\"pre\">crean()</span></code> メソッドで <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> を発生させてください。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Everything as before.</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">cleaned_data</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n        <span class=\"n\">cc_myself</span> <span class=\"o\">=</span> <span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;cc_myself&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">subject</span> <span class=\"o\">=</span> <span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">cc_myself</span> <span class=\"ow\">and</span> <span class=\"n\">subject</span><span class=\"p\">:</span>\n            <span class=\"c1\"># Only do something if both fields are valid so far.</span>\n            <span class=\"k\">if</span> <span class=\"s2\">&quot;help&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">subject</span><span class=\"p\">:</span>\n                <span class=\"k\">raise</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n                    <span class=\"s2\">&quot;Did not send for &#39;help&#39; in the subject despite &quot;</span>\n                    <span class=\"s2\">&quot;CC&#39;ing yourself.&quot;</span>\n                <span class=\"p\">)</span>\n</code></pre></div>\n<p>このコードではバリデーションエラーが発生すると、フォームのトップにエラーメッセージを表示し、(通常は) 問題を伝えます。</p>\n<p>例のコードにある <code class=\"docutils literal notranslate\"><span class=\"pre\">super().clean()</span></code> の呼び出しは、親クラスのバリデーションロジックも維持されることを保証します。<code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドで (必須ではないので) <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> ディクショナリを返さないクラスを継承している場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> の結果にアサインせず、代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">self.cleaned_data</span></code> を使用してください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n    <span class=\"n\">cc_myself</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;cc_myself&quot;</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>バリデーションエラーを通知するもう 1 つのアプローチは、エラーメッセージをフィールドの 1 つにアサインすることです。この場合、エラーメッセージはフォーム表示の  &quot;subject&quot; と &quot;cc_myself&quot; の両方の行にアサインしましょう。この方法をとるときは、フォームの出力に混乱を招かないように注意してください。ここでは何が可能なのかを示しますが、実際の状況で効果的に実装するのはあなたとあなたのデザイナー次第です。(上の例を置き換えた) 新しいコードは以下のようになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Everything as before.</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">cleaned_data</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n        <span class=\"n\">cc_myself</span> <span class=\"o\">=</span> <span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;cc_myself&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">subject</span> <span class=\"o\">=</span> <span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">cc_myself</span> <span class=\"ow\">and</span> <span class=\"n\">subject</span> <span class=\"ow\">and</span> <span class=\"s2\">&quot;help&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">subject</span><span class=\"p\">:</span>\n            <span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Must put &#39;help&#39; in subject when cc&#39;ing yourself.&quot;</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_error</span><span class=\"p\">(</span><span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">,</span> <span class=\"n\">msg</span><span class=\"p\">)</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_error</span><span class=\"p\">(</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">,</span> <span class=\"n\">msg</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">add_error()</span></code> の第 2 引数にはただの文字列か、できれば <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> のインスタンスを指定します。詳しくは <a class=\"reference internal\" href=\"#raising-validation-error\"><span class=\"std std-ref\">ValidationError を発生させる</span></a> を参照してください。<code class=\"docutils literal notranslate\"><span class=\"pre\">add_error()</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> からフィールドを自動的に削除してしまうことに注意してください。</p>\n</section>\n</section>","rootId":"form-and-field-validation","toc":[{"title":"ValidationError を発生させる","anchor":"raising-validationerror","children":[{"title":"複数のエラーを起こす","anchor":"raising-multiple-errors","children":[]}]},{"title":"実際にバリデーションを使用する","anchor":"using-validation-in-practice","children":[{"title":"バリデータを使う","anchor":"using-validators","children":[]},{"title":"フォームフィールドのデフォルトのクリーニング","anchor":"form-field-default-cleaning","children":[]},{"title":"特定のフィールド属性をクリーニングする","anchor":"cleaning-a-specific-field-attribute","children":[]},{"title":"互いに依存するフィールドをクリーニングして検証する","anchor":"cleaning-and-validating-fields-that-depend-on-each-other","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API Reference","url":"/ja/2.1/ref/"},{"docname":"ref/forms/index","title":"フォーム","url":"/ja/2.1/ref/forms/"}],"prev":{"docname":"ref/forms/widgets","title":"ウィジェット","url":"/ja/2.1/ref/forms/widgets/"},"next":{"docname":"ref/middleware","title":"ミドルウェア","url":"/ja/2.1/ref/middleware/"},"formats":{"html":"/ja/2.1/ref/forms/validation/","markdown":"/ja/2.1/ref/forms/validation.md","json":"/ja/2.1/ref/forms/validation.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/ref/forms/validation.txt","official":"https://docs.djangoproject.com/ja/2.1/ref/forms/validation/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}