{"title":"フォームとフィールドのバリデーション","version":"5.2","locale":"ja","docname":"ref/forms/validation","url":"/ja/5.2/ref/forms/validation/","canonical":"https://djangodocs.dev/ja/5.2/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\">clean()</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/5.2/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/5.2/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/5.2/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/5.2/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/5.2/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=\"s2\">&quot;Invalid value&quot;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;invalid&quot;</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=\"s2\">&quot;Invalid value&quot;</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=\"s2\">&quot;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;42&quot;</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=\"s2\">&quot;Invalid value: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</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=\"s2\">&quot;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;42&quot;</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=\"s2\">&quot;Invalid value: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;42&quot;</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=\"s2\">&quot;Invalid value&quot;</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># Bad</span>\n<span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value&quot;</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=\"s2\">&quot;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;invalid&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;42&quot;</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=\"s2\">&quot;Invalid value: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</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/5.2/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/5.2/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=\"p\">[</span>\n        <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Error 1&quot;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;error1&quot;</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=\"s2\">&quot;Error 2&quot;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;error2&quot;</span><span class=\"p\">),</span>\n    <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=\"p\">[</span>\n        <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Error 1&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Error 2&quot;</span><span class=\"p\">),</span>\n    <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/5.2/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/5.2/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\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>メールアドレスや正規表現に対する検証などの一般的なケースは、Django に既存のバリデーションクラスを使用して処理できます。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">validators.validate_slug</span></code> は、最初の引数としてパターン <code class=\"docutils literal notranslate\"><span class=\"pre\">^[-a-zA-Z0-9_]+\\Z</span></code> を指定して構築された <a class=\"reference internal\" href=\"/ja/5.2/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> のインスタンスです。利用可能なバリデータの一覧や、バリデータの書き方の例については、<a class=\"reference internal\" href=\"/ja/5.2/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\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=\"s2\">&quot;,&quot;</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> フィールドが常に <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;fred&#64;example.com&quot;</span></code> を含むようにしたいとします。これはフォームに特有のバリデーションなので、<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<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n\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=\"s2\">&quot;recipients&quot;</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\">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/5.2/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\">clean()</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<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n\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\">ValidationError</span><span class=\"p\">(</span>\n                    <span class=\"s2\">&quot;Did not send for &#39;help&#39; in the subject despite CC&#39;ing yourself.&quot;</span>\n                <span class=\"p\">)</span>\n</code></pre></div>\n<p>このコードでは、検証エラーが発生した場合、通常、問題を説明するエラーメッセージがフォームの上部に表示されます。このようなエラーは、フィールド以外のエラーとされ、テンプレート内で <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">form.non_field_errors</span> <span class=\"pre\">}}</span></code> として表示されます。</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\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=\"s2\">&quot;cc_myself&quot;</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=\"s2\">&quot;subject&quot;</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 リファレンス","url":"/ja/5.2/ref/"},{"docname":"ref/forms/index","title":"フォーム","url":"/ja/5.2/ref/forms/"}],"prev":{"docname":"ref/forms/widgets","title":"ウィジェット","url":"/ja/5.2/ref/forms/widgets/"},"next":{"docname":"ref/logging","title":"ロギング","url":"/ja/5.2/ref/logging/"},"formats":{"html":"/ja/5.2/ref/forms/validation/","markdown":"/ja/5.2/ref/forms/validation.md","json":"/ja/5.2/ref/forms/validation.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/forms/validation.txt","official":"https://docs.djangoproject.com/ja/5.2/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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}