自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django】任意のエラーメッセージを表示させる【forms.pyでerror_messagesを指定】

thumbnail

forms.pyに書いたフォームクラスを使ってバリデーションを行った時、エラーメッセージの表示ができる。

print(forms.errors)

例えば、これで入力しなければならない場所を未入力で投稿した場合、

このフィールドは入力必須です

とエラーが出てくる。やや堅めの文章であり、『フィールド』という単語はエンジニアであればまだしも、一般人はそれが何を意味しているのかわからないだろう。

そこでこの時に表示されるエラーメッセージを別のものに書き換える。

原型のコードはいつもの40分Django簡易掲示板から引用している。

forms.py

from django import forms
from .models import Topic

class TopicForm(forms.ModelForm):

    class Meta:
        model   = Topic
        fields  = ["comment"]

        error_messages = {
            'comment': {
                'max_length': "コメントの文字数が" + str(Topic.comment.field.max_length) + "文字を超えています。",
                'required': "コメントを入力してください",
            },
        }

error_messagesにフィールドを指定、エラー条件に応じて、メッセージを割り当てる。

max_lengthで指定した文字数を参照して、エラーメッセージに含めている。この方法は下記記事に書いてある。

Djangoでviews.pyからmodels.pyのフィールドオプションを参照する【verbose_name,upload_to】

views.py

from django.shortcuts import render,redirect

from django.views import View
from .models import Topic
from .forms import TopicForm

from django.contrib import messages


class BbsView(View):

    def get(self, request, *args, **kwargs):

        topics  = Topic.objects.all()
        context = { "topics":topics }

        return render(request,"bbs/index.html",context)

    def post(self, request, *args, **kwargs):

        form    = TopicForm(request.POST)

        if form.is_valid():
            print("バリデーションOK")
        else:
            print(form.errors)
            print(form.errors.get_json_data())
        
            #メッセージだけ取り出す。
            values          = form.errors.get_json_data().values()

            for value in values:
                for v in value:
                    messages.error(request, v["message"])

        return redirect("bbs:index")

index   = BbsView.as_view()

print(form.errors)でエラーメッセージが表示される時、先ほど指定したものが表示される。空欄であれば、『コメントを入力してください』、max_lengthを超過していれば『コメントの文字数が〇〇文字を超えています。』と出てくる。

ただ、form.errorsで出力されるメッセージにはname属性まで含まれている。一般の人はname属性はわからない。だから必要なのはメッセージだけ。メッセージだけ取り出して、メッセージフレームワークに入れる。

フロントにそのエラーメッセージを表示させるため、メッセージフレームワークを使用している

DjangoのMessageFrameworkで投稿とエラーをフロント側に表示する

bbs/index.html

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
	<title>簡易掲示板</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>
<body>

    <main class="container">

        {% for message in messages %}
        <div>{{ message }}</div>
        {% endfor %}

        <form method="POST">
            {% csrf_token %}
            <textarea class="form-control" name="comment"></textarea>
            <input type="submit" value="送信">
        </form>

        {% for topic in topics %}
        <div class="border">
            {{ topic.comment }}
        </div>
        {% endfor %}

    </main>
</body>
</html>

メッセージフレームワークを表示させる。

動かすとこうなる。

【補足】error_messagesで指定できるキーについて

下記リンクに表示されている、Error message keysが指定できる。

https://docs.djangoproject.com/en/4.0/ref/forms/fields/#built-in-field-classes

上記、BooleanFieldであれば、requirederror_messagesのキーとして指定できる。

django.core.validatorsを使用する場合、フィールドオプションのvalidatorsRegexValidator等を使用するが、この場合はinvalidを指定すればよい。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ