{"title":"フォームとフィールドの検証","version":"4.1","locale":"ja","docname":"ref/forms/validation","url":"/ja/4.1/ref/forms/validation/","canonical":"https://djangodocs.dev/ja/4.1/ref/forms/validation/","summary":"フォームのバリデーションは、データがクリーニング (clean) されるときに実行されます。","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\">is_valid()</code> メソッドを呼び出したときに実行されます。このほかにも、クリーニングとバリデーションのトリガーとなる処理 (直接 <code class=\"docutils literal notranslate\">errors</code> 属性にアクセスしたり、 <code class=\"docutils literal notranslate\">full_clean()</code> を直接呼び出す) がありますが、通常必要とはなりません。</p>\n<p>一般的に、あらゆるクリーニング方法は <code class=\"docutils literal notranslate\">ValidationError</code> を投げる可能性があります。処理されるデータに問題がある場合、関連情報を <code class=\"docutils literal notranslate\">ValidationError</code> コンストラクタに渡します。<a class=\"reference internal\" href=\"#raising-validation-error\"><span class=\"std std-ref\">下記項目</span></a> に、<code class=\"docutils literal notranslate\">ValidationError</code> を投げる際のベストプラクティスがあります。<code class=\"docutils literal notranslate\">ValidationError</code> が投げられない場合、メソッドはクリーニングされた (標準化された) データを Python オブジェクトとして返すはずです。</p>\n<p>Most validation can be done using <a class=\"reference internal\" href=\"#validators\">validators</a> - helpers that can be reused.\nValidators are functions (or callables) that take a single argument and raise\n<code class=\"docutils literal notranslate\">ValidationError</code> on invalid input. Validators are run after the field's\n<code class=\"docutils literal notranslate\">to_python</code> and <code class=\"docutils literal notranslate\">validate</code> methods have been called.</p>\n<p>フォームのバリデーションは複数のステップに分割されます。カスタムやオーバーライドすることができます:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">Field</code> の <code class=\"docutils literal notranslate\">to_python()</code> メソッドはすべてのバリデーションの最初のステップとなります。これは、値をデータ型に正すことを強制し、それができない場合は <code class=\"docutils literal notranslate\">ValidationError</code> を投げます。このメソッドはウィジェットからそのままの値を受け取り、変換した値を返します。たとえば、<code class=\"docutils literal notranslate\">FloatField</code> は Python の <code class=\"docutils literal notranslate\">float</code> に変換されるか、もしくは <code class=\"docutils literal notranslate\">ValidationError</code> を投げます。</p></li>\n<li><p><code class=\"docutils literal notranslate\">Field</code> の <code class=\"docutils literal notranslate\">validate()</code> メソッドは、フィールド特有のバリデーションを行います。これはバリデータとしては不適です。正しいデータ型を強制された値を取り、エラーの際は <code class=\"docutils literal notranslate\">ValidationError</code> を投げます。このメソッドは何も返さず、また値の変更も行わないはずです。バリデータに記述したくないバリデーションロジックを実行するためには、このメソッドをオーバーライドしてください。</p></li>\n<li><p><code class=\"docutils literal notranslate\">Field</code> の <code class=\"docutils literal notranslate\">run_validators()</code> メソッドはフィールドのバリデータをすべて実行し、すべてのエラーを単一の <code class=\"docutils literal notranslate\">ValidationError</code> に統合します。このメソッドをオーバーライドする必要はないはずです。</p></li>\n<li><p><code class=\"docutils literal notranslate\">Field</code> サブクラスの <code class=\"docutils literal notranslate\">clean()</code> メソッドは、<code class=\"docutils literal notranslate\">to_python()</code>、<code class=\"docutils literal notranslate\">validate()</code>、<code class=\"docutils literal notranslate\">run_validators()</code> を正しい順序で実行し、エラーを伝達する役目を負っています。もしこの過程のどこかで <code class=\"docutils literal notranslate\">ValidationError</code> が投げられた場合、バリデーションは停止し、そのエラーを投げます。このメソッドはクリーニングされたデータを返し、フォームの <code class=\"docutils literal notranslate\">cleaned_data</code> ディクショナリに格納します。</p></li>\n<li><p><code class=\"docutils literal notranslate\">clean_&lt;fieldname&gt;()</code> メソッドは、フォームサブクラス上で呼び出されます -- <code class=\"docutils literal notranslate\">&lt;fieldname&gt;</code> がフォームのフィールド属性の名前と置き換えられます。このメソッドは、フィールドのタイプにかかわらず、その特定の属性に対するクリーニングを実行します。 このメソッドはパラメータを受け取りません。<code class=\"docutils literal notranslate\">self.cleaned_data</code> 内のフィールドの値を検索する必要があり、またこの時点ではフォーム上で元々送信された文字列ではなく Python オブジェクトであること覚えておいてください (これは <code class=\"docutils literal notranslate\">cleaned_data</code> 内にあります。上記に出てきた一般フィールドの <code class=\"docutils literal notranslate\">clean()</code> メソッドがすでに一度データをクリーニングしているからです)。</p>\n<p>For example, if you wanted to validate that the contents of a\n<code class=\"docutils literal notranslate\">CharField</code> called <code class=\"docutils literal notranslate\">serialnumber</code> was unique,\n<code class=\"docutils literal notranslate\">clean_serialnumber()</code> would be the right place to do this. You don't\nneed a specific field (it's a <code class=\"docutils literal notranslate\">CharField</code>), but you want a\nformfield-specific piece of validation and, possibly, cleaning/normalizing\nthe data.</p>\n<p>このメソッドの戻り値は <code class=\"docutils literal notranslate\">cleaned_data</code> 内の既存の値を置き換えるため、(たとえこのメソッドが変更しなかったとしても) <code class=\"docutils literal notranslate\">cleaned_data</code> からのフィールドの値、ないし新しくクリーニングされた値になるはずです。</p>\n</li>\n<li><p>フォームのサブクラスの <code class=\"docutils literal notranslate\">clean()</code> メソッドは、複数のフォームフィールドにまたがるバリデーションにも使用できます。この場所には、たとえば「フィールド <code class=\"docutils literal notranslate\">A</code> が入力されたときフィールド <code class=\"docutils literal notranslate\">B</code> は有効なメールアドレスのはず」といったチェックを記述できます。このメソッドは、必要な場合はまったく違うディクショナリを返すこともでき、その場合は <code class=\"docutils literal notranslate\">cleaned_data</code> として使用されます。</p>\n<p>フィールドバリデーションのメソッドは <code class=\"docutils literal notranslate\">clean()</code> が呼ばれる際に実行されるので、フォームの <code class=\"docutils literal notranslate\">errors</code> 属性にもアクセスできるようになります。これは各フィールドのクリーニングによって発生した例外をすべて含みます。</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">Form.clean()</code></a> をオーバーライドして発生させた例外は、特定のフィールドに結びつかない点に注意してください。これらは特別な &quot;フィールド&quot; (<code class=\"docutils literal notranslate\">__all__</code> と呼ばれます) に格納され、必要に応じて <a class=\"reference internal\" href=\"/ja/4.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\">non_field_errors()</code></a> メソッドを通じてアクセスできます。特定のフィールドにエラーを紐付けて格納したい場合は、<a class=\"reference internal\" href=\"/ja/4.1/ref/forms/api/#django.forms.Form.add_error\" title=\"django.forms.Form.add_error\"><code class=\"xref py py-meth docutils literal notranslate\">add_error()</code></a> を呼び出す必要があります。</p>\n<p><code class=\"docutils literal notranslate\">ModelForm</code> サブクラスの <code class=\"docutils literal notranslate\">clean()</code> メソッドをオーバーライドする際、特に考慮する点がまだあります (詳しくは <a class=\"reference internal\" href=\"/ja/4.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\">Field.clean()</code> メソッド (ないしそのオーバーライド) が実行され、その後 <code class=\"docutils literal notranslate\">clean_&lt;fieldname&gt;()</code> が実行されます。最後に、この 2 つのメソッドが全フィールドに対して実行された後、これらのメソッドでエラーが発生したかどうかにかかわらず <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">Form.clean()</code></a> メソッド (ないしそのオーバーライド) が実行されます。</p>\n<p>各メソッドの例は後述します。</p>\n<p>上述の通り、どのメソッドでも <code class=\"docutils literal notranslate\">ValidationError</code> が発生する可能性があります。どのフィールドに対しても、<code class=\"docutils literal notranslate\">Field.clean()</code> メソッドが <code class=\"docutils literal notranslate\">ValidationError</code> を発生させた場合、フィールド特有のクリーニングメソッドは呼ばれません。一方で、すべての残りのフィールドに対するクリーニングメソッドは呼び出されます。</p>\n<section id=\"raising-validationerror\">\n<span id=\"raising-validation-error\"></span><h2><code class=\"docutils literal notranslate\">ValidationError</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\">code</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>\nValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value&#39;</span><span class=\"p\">),</span> code<span class=\"o\">=</span><span class=\"s1\">&#39;invalid&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\nValidationError<span class=\"p\">(</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\">params</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>\nValidationError<span class=\"p\">(</span>\n    _<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    params<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>\nValidationError<span class=\"p\">(</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> value<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>\nValidationError<span class=\"p\">(</span>\n    _<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    params<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>\nValidationError<span class=\"p\">(</span>\n    _<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    params<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\">gettext</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>\nValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;Invalid value&#39;</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># Bad</span>\nValidationError<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> ValidationError<span class=\"p\">(</span>\n    _<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    code<span class=\"o\">=</span><span class=\"s1\">&#39;invalid&#39;</span><span class=\"p\">,</span>\n    params<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\">clean()</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>ValidationError<span class=\"p\">(</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> value<span class=\"p\">)</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/4.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\">Form.errors.as_data()</code></a> や <a class=\"reference internal\" href=\"/ja/4.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\">Form.errors.as_json()</code></a> メソッドは、十分な機能を有する (<code class=\"docutils literal notranslate\">code</code> 名と <code class=\"docutils literal notranslate\">params</code> ディクショナリを持つ) <code class=\"docutils literal notranslate\">ValidationError</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\">ValidationError</code> コンストラクタにエラーのリストを引き渡すことが可能です。</p>\n<p>上述の通り、<code class=\"docutils literal notranslate\">ValidationError</code> インスタンスには <code class=\"docutils literal notranslate\">code</code> と <code class=\"docutils literal notranslate\">params</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> ValidationError<span class=\"p\">([</span>\n    ValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;Error 1&#39;</span><span class=\"p\">),</span> code<span class=\"o\">=</span><span class=\"s1\">&#39;error1&#39;</span><span class=\"p\">),</span>\n    ValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;Error 2&#39;</span><span class=\"p\">),</span> code<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> ValidationError<span class=\"p\">([</span>\n    _<span class=\"p\">(</span><span class=\"s1\">&#39;Error 1&#39;</span><span class=\"p\">),</span>\n    _<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's form (and model) fields support use of utility functions and classes\nknown as validators. A validator is a callable object or function that takes a\nvalue and returns nothing if the value is valid or raises a\n<a class=\"reference internal\" href=\"/ja/4.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\">ValidationError</code></a> if not. These can be passed to a\nfield's constructor, via the field's <code class=\"docutils literal notranslate\">validators</code> argument, or defined on the\n<a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> class itself with the <code class=\"docutils literal notranslate\">default_validators</code>\nattribute.</p>\n<p>Validators can be used to validate values inside the field, let's have a look\nat Django's <code class=\"docutils literal notranslate\">SlugField</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=\"nn\">django.core</span> <span class=\"kn\">import</span> validators\n<span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> CharField\n\n<span class=\"k\">class</span> <span class=\"nc\">SlugField</span><span class=\"p\">(</span>CharField<span class=\"p\">):</span>\n    default_validators <span class=\"o\">=</span> <span class=\"p\">[</span>validators<span class=\"o\">.</span>validate_slug<span class=\"p\">]</span>\n</code></pre></div>\n<p>As you can see, <code class=\"docutils literal notranslate\">SlugField</code> is a <code class=\"docutils literal notranslate\">CharField</code> with a customized validator\nthat validates that submitted text obeys to some character rules. This can also\nbe done on field definition so:</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>slug <span class=\"o\">=</span> forms<span class=\"o\">.</span>SlugField<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>slug <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>validators<span class=\"o\">=</span><span class=\"p\">[</span>validators<span class=\"o\">.</span>validate_slug<span class=\"p\">])</span>\n</code></pre></div>\n<p>一般的なケース (例えば、E メールや正規表現に対する検証) は、Django が提供する既存のバリデータクラスを使って処理できます。例えば、<code class=\"docutils literal notranslate\">validators.validate_slug</code> は <a class=\"reference internal\" href=\"/ja/4.1/ref/validators/#django.core.validators.RegexValidator\" title=\"django.core.validators.RegexValidator\"><code class=\"xref py py-class docutils literal notranslate\">RegexValidator</code></a> の第 1 引数をパターン <code class=\"docutils literal notranslate\">^[-a-zA-Z0-9_]+$</code> としたインスタンスです。<a class=\"reference internal\" href=\"/ja/4.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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.validators</span> <span class=\"kn\">import</span> validate_email\n\n<span class=\"k\">class</span> <span class=\"nc\">MultiEmailField</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <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> value<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[]</span>\n        <span class=\"k\">return</span> value<span class=\"o\">.</span>split<span class=\"p\">(</span><span class=\"s1\">&#39;,&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">validate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <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>validate<span class=\"p\">(</span>value<span class=\"p\">)</span>\n        <span class=\"k\">for</span> email <span class=\"ow\">in</span> value<span class=\"p\">:</span>\n            validate_email<span class=\"p\">(</span>email<span class=\"p\">)</span>\n</code></pre></div>\n<p>このフィールドを使うすべてのフォームでは、フィールドのデータを使えるようになる前に、これらのメソッドが実行されます。これはこのタイプのフィールドに特有であり、それはこの後の使われ方には関係ありません。</p>\n<p>Let's create a <code class=\"docutils literal notranslate\">ContactForm</code> to demonstrate how you'd use this field:</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=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    subject <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    message <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n    sender <span class=\"o\">=</span> forms<span class=\"o\">.</span>EmailField<span class=\"p\">()</span>\n    recipients <span class=\"o\">=</span> MultiEmailField<span class=\"p\">()</span>\n    cc_myself <span class=\"o\">=</span> forms<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Use <code class=\"docutils literal notranslate\">MultiEmailField</code> like any other form field. When the <code class=\"docutils literal notranslate\">is_valid()</code>\nmethod is called on the form, the <code class=\"docutils literal notranslate\">MultiEmailField.clean()</code> method will be\nrun as part of the cleaning process and it will, in turn, call the custom\n<code class=\"docutils literal notranslate\">to_python()</code> and <code class=\"docutils literal notranslate\">validate()</code> methods.</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\">ContactForm</code> の <code class=\"docutils literal notranslate\">recipients</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\">MultiEmailField</code> クラスには記述したくありません。代わりに <code class=\"docutils literal notranslate\">recipients</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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> ValidationError\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<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=\"nf\">clean_recipients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        data <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<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> data<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> ValidationError<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> data\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\">cc_myself</code> フィールドが <code class=\"docutils literal notranslate\">True</code> の場合、<code class=\"docutils literal notranslate\">subject</code> には必ず <code class=\"docutils literal notranslate\">&quot;help&quot;</code> という言葉が含まれるという要件です。この場合、複数のフィールドにまたがったバリデーションを行うので、フォームの <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">clean()</code></a> メソッドで行うのが適切です。ここで注意すべきなのは、今扱っているのはフォームの <code class=\"docutils literal notranslate\">clean()</code> メソッドであり、上記で扱ってきたフィールドの <code class=\"docutils literal notranslate\">clean()</code> ではないということです。バリデーションを記述すする場所を決める際は、フィールドとフォームの違いを明確にすることが重要です。 フィールドは単一のデータポイントであり、フォームはフィールドの集まりです。</p>\n<p>フォームの <code class=\"docutils literal notranslate\">clean()</code> メソッドが呼び出されるまでに、個別のフィールドのクリーンメソッドが呼び出されているので (上記 2 つのセクションで見た通りです)、<code class=\"docutils literal notranslate\">self.cleaned_data</code> にはこれまでのクリーニングで生き残ったデータが格納されています。したがって、検証しようとしているフィールドが、この個別フィールドのチェックを生き残っていない可能性を考慮する必要があります。</p>\n<p>この段階でのエラーを通知するには 2 つの方法があります。おそらく最も一般的な方法は、フォームのトップでエラーを表示する方法です。このようなエラーを生成するには、<code class=\"docutils literal notranslate\">clean()</code> メソッドで <code class=\"docutils literal notranslate\">ValidationError</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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> ValidationError\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<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=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        cleaned_data <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n        cc_myself <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;cc_myself&quot;</span><span class=\"p\">)</span>\n        subject <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> cc_myself <span class=\"ow\">and</span> subject<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> subject<span class=\"p\">:</span>\n                <span class=\"k\">raise</span> ValidationError<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>In this code, if the validation error is raised, the form will display an\nerror message at the top of the form (normally) describing the problem. Such\nerrors are non-field errors, which are displayed in the template with\n<code class=\"docutils literal notranslate\">{{ form.non_field_errors }}</code>.</p>\n<p>例のコードにある <code class=\"docutils literal notranslate\">super().clean()</code> の呼び出しは、親クラスのバリデーションロジックも維持されることを保証します。<code class=\"docutils literal notranslate\">clean()</code> メソッドで (必須ではないので) <code class=\"docutils literal notranslate\">cleaned_data</code> ディクショナリを返さないクラスを継承している場合、<code class=\"docutils literal notranslate\">cleaned_data</code> を <code class=\"docutils literal notranslate\">super()</code> の結果にアサインせず、代わりに <code class=\"docutils literal notranslate\">self.cleaned_data</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=\"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>clean<span class=\"p\">()</span>\n    cc_myself <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<span class=\"o\">.</span>get<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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<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=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        cleaned_data <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n        cc_myself <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;cc_myself&quot;</span><span class=\"p\">)</span>\n        subject <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> cc_myself <span class=\"ow\">and</span> subject <span class=\"ow\">and</span> <span class=\"s2\">&quot;help&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> subject<span class=\"p\">:</span>\n            msg <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>add_error<span class=\"p\">(</span><span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">,</span> msg<span class=\"p\">)</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>add_error<span class=\"p\">(</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">,</span> msg<span class=\"p\">)</span>\n</code></pre></div>\n<p>The second argument of <code class=\"docutils literal notranslate\">add_error()</code> can be a string, or preferably an\ninstance of <code class=\"docutils literal notranslate\">ValidationError</code>. See <a class=\"reference internal\" href=\"#raising-validation-error\"><span class=\"std std-ref\">ValidationError を発生させる</span></a> for more\ndetails. Note that <code class=\"docutils literal notranslate\">add_error()</code> automatically removes the field from\n<code class=\"docutils literal notranslate\">cleaned_data</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/4.1/ref/"},{"docname":"ref/forms/index","title":"フォーム","url":"/ja/4.1/ref/forms/"}],"prev":{"docname":"ref/forms/widgets","title":"ウィジェット","url":"/ja/4.1/ref/forms/widgets/"},"next":{"docname":"ref/logging","title":"ロギング","url":"/ja/4.1/ref/logging/"},"formats":{"html":"/ja/4.1/ref/forms/validation/","markdown":"/ja/4.1/ref/forms/validation.md","json":"/ja/4.1/ref/forms/validation.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/ref/forms/validation.txt","official":"https://docs.djangoproject.com/ja/4.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","it","pt-br","ko","es","el","pl"]}