開発環境
windows10
python 3.7.9
Django 2.2.2
PostgreSQL 10.18
解決したいこと
Djangoでアプリケーションを作っているのですが、Ajaxを使っていてpythonで返す値を最後Json形式に変換してから画面上にレスポンスを返したいです。
発生している問題・エラー
画面上にレスポンス返せても文字化けを起こしてしまう。
具体的には英語、数字は問題なく表示できるが日本語が文字化けしてしまう。UTF-8でコーディングしているのに"U3042"みたいな感じでUnicode形式になってしまう。
[{"model": "library.book", "pk": "3893814317", "fields": {"book_register_date": "2022-01-14T10:48:19", "book_author": "\u3042\u3060\u3061\u305f\u304f\u3084", "book_title": "test2", "book_sub_title": "test2", "book_sample_path": "test2", "book_publisher": "\u8db3\u7acb", "book_page_num": 1000, "book_genre": "A", "book_symbol": "A", "book_num": "A", "book_isbn_num": "1234567890128", "book_lend_count": 1, "book_sample_count": 1, "book_delete_flg": false, "book_lend_flg": false}}]
というように一部文字化けしてしまう
該当するソースコード
view.py
python
1class LendView(generic.ListView, models.Model): 2 template_name = "lend.html" 3 paginate_by = 5 4 model = Book 5 6 def scandisp(req): 7 #カメラのプログラムを呼び出しています 8 scandata = write_data.kasidasi() 9 # 受け取ったデータをhtmlに渡す。 10 11 for list in scandata: 12 data2 = Book.objects.filter(book_isbn_num = list) 13 data3 = data2.only() 14 15 #serializeでjson形式に変換 16 data_list = serializers.serialize("json", data3) 17 #最後にレスポンス 18 return JsonResponse(data_list, safe=False)
HTML部分
html
1<body> 2 <span>文字を入力した後にボタンを押してください</span> 3 <br> 4 <button type="button" id="lend" onclick="clickBtn()">貸出</button> 5 <br> 6 <span id="text"> 7 </span> 8
javascript
1<script> 2 function clickBtn() { 3 var txt = document.getElementById("lend").value; 4 5 $.ajax({ 6 url: "{% url 'library:scandisp' %}", 7 method: 'GET', 8 data: {"input_data": txt}, 9 dataType: "json", 10 contentType: "application/json", 11 beforeSend: function(xhr, settings) { 12 if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 13 xhr.setRequestHeader("X-CSRFToken", csrf_token); 14 } 15 }, 16 error: function(xhr, status, error) { 17 console.log("error") 18 } 19 }) 20 .done(function(data) { 21 var aaa = document.getElementById("text").textContent = data; 22 var bbb = encodeURIComponent(aaa); 23 document.getElementById('text2').innerText = bbb; 24 console.log("text2"); 25 }); 26 27 // csrf_tokenの取得に使う 28 function getCookie(name) { 29 var cookieValue = null; 30 if (document.cookie && document.cookie !== '') { 31 var cookies = document.cookie.split(';'); 32 for (var i = 0; i < cookies.length; i++) { 33 var cookie = jQuery.trim(cookies[i]); 34 // Does this cookie string begin with the name we want? 35 if (cookie.substring(0, name.length + 1) === (name + '=')) { 36 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 37 break; 38 } 39 } 40 } 41 return cookieValue; 42 } 43 44 // ヘッダにcsrf_tokenを付与する関数 45 function csrfSafeMethod(method) { 46 // these HTTP methods do not require CSRF protection 47 return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 48 }; 49 } 50 51</script>
自分で試したこと
python側でJSONへ変換する処理を変得てみたのですが、
data_list = serializers.serialize("json", data3) ↓ data_list = json.dumps(data3, ensure_ascii=False, encoding='utf8', indent=2) AttributeError: type object '' has no attribute 'abstract
とエラーが出てしまい解決せず。
scriptタグの中でエンコード方式を指定しても解決しませんでした。
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/01/28 03:03
2022/01/28 04:35
2022/01/28 05:02
2022/01/28 06:15