djangoのviewsのバックエンドからフロント(Ajax)にform.errors.as_json()を使用して返す方法を紹介します。
実際にこの手の解説はdjangoチュートリアルにもあるのですが、いまいち使い方がわかりませんのでこの記事で説明します。
参考 https://docs.djangoproject.com/ja/2.1/ref/forms/api/
・フォームAPIをより理解したい人
・djangoのformの基礎知識がある人
ちなみにstackoverflowにも同様の質問がありました。
How to JSON parse using form.errors.as_json() in Django return JsonResponse(data)
コンテンツ
実行環境
以下が実行環境になります。
・OS : Mac
・django 2.2
・python 3.8
・Ajax利用
一般的な書き方
方法はたくさんありますが一番単純なやり方です。
vews.py
1 2 3 4 5 6 7 8 |
from django.http.response import JsonResponse if not form.is_valid(): data = { 'status': 'False', 'message': '有効な値ではありません' } return JsonResponse(data=data) |
こんな感じになります。
辞書型オブジェクトのdataに、status(状態)とmessageを返すための値を格納し、6行目のJsonResponseメソッドを利用してフロントに返します。
ちなみにjs側も書いてみると
sample.js
1 2 3 4 5 |
$('#submit-btn') .before( '<ul class="errorlist"><li>' + data['message'] + '</li></ul>' |
簡単に解説すると、djangoのバリデーションエラー発生時に付与するul・liタグを付与しています。
そしてメッセージとしては、views側からreturnされたdataの辞書型オブジェクトのmessageキーの値をjs側で使用しています。
form.errors.as_json()を使い方と書き方
最初にコードを紹介しその後コードの中身を説明します。
sample.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import json from django.http.response import JsonResponse if not form.is_valid(): json_dict = json.loads(form.errors.as_json()) # json_msg = '' # for json_msg_value in json_dict.values(): # json_msg = json_msg_value[0]['message'] json_msg = json_dict['avator'][0]['message'] data = { 'status': 'False', 'message': json_msg, } return JsonResponse(data=data) |
sample.js
1 2 3 4 5 |
$('#submit-btn') .before( '<ul class="errorlist"><li>' + data['message'] + '</li></ul>' |
sample.pyについて上から順に説明します。
5行目でformが有効ではない時、つまりエラーをはいた時の処理を書いていきます。
6行目でform.errors.as_json()でエラーをjsonで返すメソッドになります。ちなみにここの問題点として吐き出す型がstring(文字列)というところです。
そのまま加工しても良いのですが、json文字列を上手く処理してくれるメソッドがPythonには用意されています。
それがjson.loads()になります。
参考 https://docs.python.org/ja/3/library/json.html
こちらのメソッドを利用すると辞書型オブジェクトとして処理をしてくれます。
12行目ではその辞書型オブジェクトからmessageがキーにありますので、そちらを取得するコードを書いています。
それを14行目のdataオブジェクトのmessageキーのバリューとして置いています。
8行目-10行目はバリデーションエラーが複数発生する場合のループ処理になります。
こちらコメントアウトをはずしても使用できますが、今回はフィールドが1つしかないため、シンプルに9行目で使用をしています。
スクールを利用して本格的に学ぶ
いかがでしたでしょうか?
10人中9人が挫折すると言われるプログラミングを、ヒロヤンも実はプログラミングスクールで学習をしてきたからで、結果、今はPythonエンジニアとして働いています。
挫折率が高いプログラミングこそお金を払ってメンターを付けて、道を見失わないように環境を構築する必要があるのではないでしょうか。
これはダイエットで自分一人では痩せられないけど、トレーナーを付けて否が応でもせざるを得ない環境を作ると一緒ですね。
ヒロヤンもプログラミング勉強開始直後はあれこれ悩みましたが、悩むよりも手っ取り早くスクールに登録した方が最短ルートで勉強できるのではないかと考え、結果挫折せずに今に至っています。
今なら無料でキャリアカウンセリングを行っているCodeCamp(コードキャンプ)のようなプログラミングスクールもありますのでこれを機会に是非カウンセリングだけでも受けてみてはいかがでしょうか?
上記リンク先から無料相談ができます。
またこちら(↓)ではPython専用のプログラミングスクールをまとめ紹介しています。
コメントを残す