質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

4212閲覧

Djangoでの部分ページレンダリングの手法

raffcro

総合スコア11

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2018/11/24 16:56

編集2018/11/25 00:07

お世話になります。Djangoの学習を行っております。

Djangoで部分ページのレンダリングを行えるものかと
色々と調べたのですが今のところDjangoの機能だけで出来るような方法を
見つけることが出来ませんでした。ご存知の方がいらっしゃいましたらご教示頂けますと幸いです。
(django-render-partialをimportしたり、iFrameを使用すれば
出来そうな気はするのですが、セオリーの確認をさせて下さい。)

環境バージョン
Python3.6.6
Django2.1.2

□実現したい事
以下のように1ページ内にテンプレートを組んだ場合に、
テンプレートA内に設置したボタンを押下し、テンプレートB部分のみ
HTMLのレンダリングを行いたい。
<Form method="POST"><button submit>、またはajaxでも構いません)

[One Page]
・テンプレートA.html ボタンXを押下 -> テンプレートB部分のみレンダリング
・テンプレートB.html
(Extends テンプレート)

検証用ソースです。ご参考になれば。

urls

1# from django import views 2from django.views.generic.base import View 3from django.urls import include, path 4from . import views 5 6 7urlpatterns = [ 8 path('', views.index.as_view(), name='index'), 9 path('base', views.base.as_view(), name='base'), 10 path('mylist', views.mylist.as_view(), name='mylist'), 11 path('mylist/ajax_refresh', views.ajax_refresh, name='ajax_refresh'), 12] 13

views

1from django.shortcuts import get_object_or_404, render 2from django.views.generic.base import View 3from django.http import JsonResponse, HttpResponse 4from django.template import loader 5 6 7class base(View): 8 def post(self, request, *args, **kwargs): 9 pass 10 11 def get(self, request, *args, **kwargs): 12 return render(request, 'base.html') 13 14 15class index(View): 16 17 def post(self, request, *args, **kwargs): 18 pass 19 20 def get(self, request, *args, **kwargs): 21 data = {'testdata': '変更前テスト'} 22 template = loader.get_template('display/index.html') 23 return HttpResponse(template.render(data, request)) 24 25 26class mylist(View): 27 28 def post(self, request, *args, **kwargs): 29 return render(request, 'display/_mylist.html') 30 31 def get(self, request, *args, **kwargs): 32 return render(request, 'display/_mylist.html') 33 34 35def ajax_refresh(request): 36 data = {'testdata': '変更後テスト'} 37 template = loader.get_template('display/index.html') 38 return HttpResponse(template.render(data, request)) 39

javascript

1$(function() { 2 3 $('#btninsert').click(function (e) { 4 console.log('test1'); 5 }); 6 7 $('#btnupdate').click(function (e) { 8 console.log('test2'); 9 }); 10 11 $('#btndelete').click(function (e) { 12 console.log('test3'); 13 }); 14 15 // $('#btnrefresh').click(function (e) { 16 // $.ajax({ 17 // url: list_template_name + '/ajax_refresh', 18 // type: 'POST', 19 // headers: csrftoken, 20 // data: { 21 // 'userdictionary_seq': 'test', 22 // }, 23 // }).done(function (r) { 24 // console.log('ok'); 25 // }).fail(function (r) { 26 // console.log('no'); 27 // }); 28 // }); 29}); 30 31$.ajaxSetup({ 32 beforeSend: function (xhr, settings) { 33 if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 34 xhr.setRequestHeader("X-CSRFToken", csrftoken); 35 } 36 } 37}); 38 39function getCookie(name) { 40var cookieValue = null; 41if (document.cookie && document.cookie !== '') { 42 var cookies = document.cookie.split(';'); 43 for (var i = 0; i < cookies.length; i++) { 44 var cookie = jQuery.trim(cookies[i]); 45 // Does this cookie string begin with the name we want? 46 if (cookie.substring(0, name.length + 1) === (name + '=')) { 47 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 48 break; 49 } 50 } 51} 52return cookieValue; 53} 54 55var csrftoken = getCookie('csrftoken'); 56 57function csrfSafeMethod(method) { 58// these HTTP methods do not require CSRF protection 59return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 60} 61

base

1{% load static %} 2<html> 3 4<header> 5 <link rel="stylesheet" href="{% static 'css/lib/datatable/dataTables.bootstrap.min.css' %}"> 6 <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> 7 8 <body> 9 <div style="display: block"> 10 11 <div>baseタイトル</div> 12 13 <div> 14 {% block content %}{% endblock%} 15 </div> 16 </div> 17 18 <script src="{% static 'js/jquery/jquery-3.3.1.min.js' %}"></script> 19 <script src="{% static 'js/data-table/datatables.min.js' %}"></script> 20 <script src="{% static 'js/data-table/jquery.dataTables.min.js' %}"></script> 21 <script src="{% static 'js/example.js' %}"></script> 22 <script> 23 list_template_name="{% url 'mylist' %}" 24 </script> 25</body> 26 27</html>

index

1{% extends 'base.html' %} 2 3{%block content%} 4<button id="btninsert">add</button> 5<button id="btndelete">delete</button> 6<button id="btnupdate">update</button> 7 8<input type="text"> 9 10{% include 'display/_mylist.html' %} 11 12{% endblock %} 13

mylist

1<form method="POST">{% csrf_token %} 2 <button method="POST" id="btnrefresh">refresh</button> 3</form> 4<h4>あい{{ testdata }}</h4> 5 6<table id="bootstrap-data-table" class="table table-striped table-bordered table-hover table-condensed datatable"> 7 <thead> 8 <tr> 9 <th>col1</th> 10 <th>col2</th> 11 <th>col3</th> 12 </tr> 13 </thead> 14 <tdody> 15 <tr> 16 <td>Row 0 Data 1</td> 17 <td>Row 0 Data 2</td> 18 <td>etc</td> 19 </tr> 20 <tr> 21 <td>Row 1 Data 1</td> 22 <td>Row 1 Data 2</td> 23 <td>etc</td> 24 </tr> 25 <tr> 26 <td>Row 2 Data 1</td> 27 <td>Row 2 Data 2</td> 28 <td>etc</td> 29 </tr> 30 <tr> 31 <td>Row 3 Data 1</td> 32 <td>Row 3 Data 2</td> 33 <td>etc</td> 34 </tr> 35 <tr> 36 <td>Row 4 Data 1</td> 37 <td>Row 4 Data 2</td> 38 <td>etc</td> 39 </tr> 40 <tr> 41 <td>Row 5 Data 1</td> 42 <td>Row 5 Data 2</td> 43 <td>etc</td> 44 </tr> 45 <tr> 46 <td>Row 6 Data 1</td> 47 <td>Row 6 Data 2</td> 48 <td>etc</td> 49 </tr> 50 <tr> 51 <td>Row 7 Data 1</td> 52 <td>Row 7 Data 2</td> 53 <td>etc</td> 54 </tr> 55 <tr> 56 <td>Row 8 Data 1</td> 57 <td>Row 8 Data 2</td> 58 <td>etc</td> 59 </tr> 60 <tr> 61 <td>Row 9 Data 1</td> 62 <td>Row 9 Data 2</td> 63 <td>etc</td> 64 </tr> 65 <tr> 66 <td>Row A Data 1</td> 67 <td>Row A Data 2</td> 68 <td>etc</td> 69 </tr> 70 <tr> 71 <td>Row B Data 1</td> 72 <td>Row B Data 2</td> 73 <td>etc</td> 74 </tr> 75 </tdody> 76</table> 77

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

デフォルトのDjangoには支援するような機能はないはず。
自分でやるときはユーザー操作で読み込ませたい部分は別URLで作って
ajaxとかで読み込ませてます。

投稿2018/11/25 14:04

kokardy

総合スコア781

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raffcro

2018/11/26 07:05

ご回答有難うございます。Djangoの標準でそのような機能が無さそうとのことなので、JQueryのDatatablesの場合はJSON等でオブジェクトの受け渡しで、それ以外の場合は場面毎に工夫が必要そうですね。参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問