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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1824閲覧

Django のテンプレートで継承したテンプレートに値を渡す方法

fa5

総合スコア13

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/08 06:36

Django でwebアプリを作成しています。

クリックで開閉するドロップダウンリストを作成しようと思い、ベースとなるテンプレートを用意し、
それを継承したテンプレートにリストの中身を記述しようと考えています。

dropdown_base.html

1<div> 2 <input id="{% block name %}{% endblock %}" type="checkbox"> 3 <label for="{% block name %}{% endblock %}"> 4 {% block label %}{% endblock %} 5 </label> 6 7 {% block content %}{% endblock %} 8</div>

child.html

1{% extends dropdown_base.html %} 2 3{% block name %}menu{% endblock %} 4{% block label %}label{% endblock %} 5{% block content%} 6 <ul> 7 ~~~~ 8 </ul> 9{% endblock %}

上記のように継承側からドロップダウンの開閉を制御するチェックボックスの id を指定して、
その id と同じ for 要素を持った label を設置する形で作成しようと試してみましたが、
どうやら同じ名称の block は複数存在してはいけないようでエラーになってしまいました。

そこで、継承側からベースとなるテンプレートへ id にあたる値を渡し、

dropdown_base.html

1<div> 2 <input id="{{ name }}" type="checkbox"> 3 <label for="{{ name }}"> 4 {% block label %}{% endblock %} 5 </label> 6 7 {% block content %}{% endblock %} 8</div>

のように書けないかとも考えましたが、ベース側にうまく値を渡す方法がわかりませんでした。

イメージとしては、

child.html

1{% extends dropdown_base.html with name="menu" %}

の様にかければ最高なのですが、、、

同じような機能が実装できれば、値を渡す以外の方法でも構いません。
どうぞ、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

include を使うのはダメなんでしょうか。(意図的に避けてるようにも見えますが)
私であれば、部分的なテンプレートに対して include と with を使って作るような気がします。

# dropdown_block.html <div> <input id="{{ name }}" type="checkbox"> <label for="{{ label }}"> {{ label }} </label> <ul> {% for c in contents %} <li>{{ c }}</li> {% endfor %} </ul> </div>
# 使う方法 {% include "dropdown_block.html" with name="name1" label="label1" contents=contents1 %}

参考: https://docs.djangoproject.com/ja/2.1/ref/templates/builtins/#include

追記

実際に試してないので、動くかわかりませんが、似たような回答が Stackoverflowにありました。 多分下記のように block.super をうまく使うと name変数を継承先でもセットできそうです。

https://stackoverflow.com/a/46581444/7724457

継承元テンプレート

{% block dropdown_wrapper %} <div> <input id="{{ name }}" type="checkbox"> <label for="{{ name }}"> {% block label %}{% endblock %} </label> {% block content %}{% endblock %} </div> {% endblock %}

継承先テンプレート

{% extends dropdown_base.html %} {% block dropdown_wrapper %} {% with name="name1" %} {{ block.super }} {% endwith%} {% endblock %} {% block label %}label{% endblock %} {% block content%} <ul> ~~~~ </ul> {% endblock %}

投稿2019/01/08 07:08

編集2019/01/08 16:01
tell_k

総合スコア2120

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

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

fa5

2019/01/08 13:46

ご回答ありがとうございます。 私自身も include による方法を最初は考えていたのですが、extends にしたほうがコンテンツ部分を自由に設定できるのではないかと考え、今回の質問に至りました。 extends の方はコンテンツ部分のHTMLを継承側で記述するので、例えば <li> の中に <div> で囲まれたブロック要素を入れるなどが可能と考えました。 頂いた回答をもとに、引き続き何かいい方法がないか自分でも探してみたいと思います。
tell_k

2019/01/08 16:02

なるほど理解いたしました。別案を回答してみました。もしよかったら参考にしてみてください。
fa5

2019/01/13 14:06

先ほど試してみたところ、追記していただいた方法で想定していた機能が実装できました。 どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問