小梅の日記帳

覚書き、メモ、等々残していくつもりです。

clean関数の結果を比較する

formsでのバリデーションを行う方法として、

  • Djangoのバリデーション

 required 文字数

  • 独自バリデーション

 clean_フィールド名関数を実装する。

 複数フィールドを組み合わせたバリデーション。

この3種類がある。

参考

<html>
<body>
<form action="" method="post">
  {% csrf_token %}
  {% if form.errors %}
    {% for errors in form.errors.values %}
      {% for error in errors %}
        {{ error }}<br>
      {% endfor %}
    {% endfor %}
  {% endif %}

  {% for field in form %}
    <div>
      {{ field.label_tag }}
    </div>

    <div>
      {{ field }}
    </div>
  {% endfor %}
  <button type="submit">送信</button>
</form>
</body>
</html>

次にforms.pyを追加する。

from django import forms
from django.core import validators
from . import models

class ProductForm(forms.Form):
  name = forms.ModelChoiceField(models.Product.objects, 
                                label='商品', 
                                to_field_name='code')

  product = forms.CharField(required=False,
                            validators=[validators.MaxLengthValidator(10)])

  # clean_product関数
  def clean_product(self):
    product = self.cleaned_data['product']
    if len(product) > 5:
      raise forms.ValidationError("productのエラー")
    
    return product

  # clean関数
  def clean(self):
    clean_data = super().clean()
    return cleaned_data 

ここで、3箇所バリデーション行っている。

いずれも実行ボタンを押した時に発行されるエラーは画面に表示されるものであった。

f:id:wataru-s0208:20190723231842p:plain
エラー表示

次はエラーの種類を大まかに実装してみたいと思う。