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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

1308閲覧

DjangoでViewからテンプレートへデータを渡すには

anvinon

総合スコア38

Django

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/06/01 07:13

編集2018/06/01 10:24

前提・実現したいこと

Djangoで音楽に関するWEBアプリを作っております。
viewで動的に作ったデータをテンプレートのプルダウンで表示させたいです。

WEBアプリの処理の手順

1.まず、音楽のアーティスト名を下記の画像の赤枠内に入力して、アーティスト名でデータベース内を検索する。
※画像下部のインクリメンタルサーチはまだ補助的な使い方にとどめていますので、今回の質問とは無関係です。
添付画像1

コードでの説明
formsのSearchFormで生成したフォームをviewsのindexアクションに渡し、index.htmlテンプレートで表示させてます。
そちらにアーティスト名を入力します。

2.1.で入力したアーティスト名でデータベースを検索し、そのアーティストの所属する音楽ジャンルが添付画像2のように表示される。
添付画像2

コードでの説明
入力したアーティスト名はaddアクションに飛び、アーティスト名からそのアーティストが所属する音楽ジャンル(9つまで)をデータベースから引き出す。
アーティスト名と音楽ジャンルを今度はresult.htmlに表示させます。

該当のソースコード

html

1<!-- 下記は index.html です。 --> 2{% load static %} 3<link rel="stylesheet" type="text/css" href="{% static 'search/css/style.css' %}" /> 4<h1>Gusic</h1> 5<h2>アーティスト名を入力してください。</h2> 6<h3>※ご参考までに以下のインクリメンタルサーチもご利用ください。</h3> 7 <form action="add" method="get"> 8 {{ form.errors.name }} 9 <label>{{ form.name.label }}{{ form.name }}</label><br/> 10 <input type="submit" value="検索"> 11 </form> 12 13<h2>アーティスト名の頭文字から選択してから、下記に表示されるインクリメンタルサーチをご利用ください。</h2> 14 <form action="index" method="get" name="initial" id"=initial"> 15 {{ initialForm.errors.initial }} 16 <label>{{ initialForm.initial }}</label><br/> 17 <input type="button" value="選択" id="submit()" onclick="submit()" /> 18 </form> 19<h2>インクリメンタルサーチ</h2> 20 <input id="keyword" type="text" /> 21 <ol id="list"> 22 {% url 'search:genre' as genre_url %} 23 {% for a in artists %} 24<li><a href="{% url 'search:genre' %}">{{ a.name }}</a></li> 25 {% endfor %} 26 </ol> 27 28 29<script type="text/javascript"> 30 var artists = {{ artists_list|safe }}; 31</script> 32 33<script src="{% static 'search/js/index.js' %}"></script>

python

1# 下記はviews.pyです。 2from django.shortcuts import render, redirect 3from .forms import * 4from .models import Artist 5 6def index(request): 7 form = SearchForm(request.GET or None) 8 initialForm = InitialForm(request.GET or None) 9 if initialForm.is_valid(): 10 initial = initialForm.cleaned_data["initial"] 11 initial = int(initial) 12 q = initialForm.choices[initial][1] 13 artists = Artist.objects.filter(name__istartswith=q) 14 artists_list = artists.values_list('name', flat = True) 15 artists_list = list(artists_list) 16 f = { 17 'form': form, 18 'initialForm': initialForm, 19 'artists_list': artists_list 20 } 21 return render(request, 'search/index.html', f) 22 else : 23 f = { 24 'form': form, 25 'initialForm': initialForm, 26 } 27 return render(request, 'search/index.html', f) 28 29def add(request) : 30 genre = GenreForm(request.GET or None) 31 form = request.GET['name'] 32 genres = [] 33 name = Artist.objects.filter(name__iexact=form).values_list('name', flat = True)[0] 34 genre1= Artist.objects.filter(name__iexact=form).values_list('genre1', flat = True)[0] 35 genres.append(genre1) 36 genre2= Artist.objects.filter(name__iexact=form).values_list('genre2', flat = True)[0] 37 genres.append(genre2) 38 genre3= Artist.objects.filter(name__iexact=form).values_list('genre3', flat = True)[0] 39 genres.append(genre3) 40 genre4= Artist.objects.filter(name__iexact=form).values_list('genre4', flat = True)[0] 41 genres.append(genre4) 42 genre5= Artist.objects.filter(name__iexact=form).values_list('genre5', flat = True)[0] 43 genres.append(genre5) 44 genre6= Artist.objects.filter(name__iexact=form).values_list('genre6', flat = True)[0] 45 genres.append(genre6) 46 genre7= Artist.objects.filter(name__iexact=form).values_list('genre7', flat = True)[0] 47 genres.append(genre7) 48 genre8= Artist.objects.filter(name__iexact=form).values_list('genre8', flat = True)[0] 49 genres.append(genre8) 50 genre9= Artist.objects.filter(name__iexact=form).values_list('genre9', flat = True)[0] 51 genres.append(genre9) 52 genres = list(filter(lambda a: a != '', genres)) 53 j = { 54 'name': name, 55 'genres' : genres, 56 } 57 return render(request, 'search/result.html', j) 58 59def result(request): 60 return(request, 'search/result.html') 61 62def genre(request): 63 return(request, 'search/genre.html')

python

1# 下記はforms.pyです。 2from django import forms 3from .views import * 4 5class SearchForm(forms.Form): 6 name = forms.CharField( 7 label='アーティスト名', 8 max_length=255, 9 required=True, 10 widget=forms.TextInput() 11 ) 12 13class GenreForm(forms.Form): 14 genre = forms.ChoiceField(choices = [ 15 ] 16 ) 17 18 19class InitialForm(forms.Form): 20 initial = forms.ChoiceField(choices = [ 21 (0, "A"), 22 (1, "B"), 23 (2,"C"), 24 (3,"D"), 25 (4,"E"), 26 (5,"F"), 27 (6,"G"), 28 (7,"H"), 29 (8,"I"), 30 (9,"J"), 31 (10,"K"), 32 (11,"L"), 33 (12,"M"), 34 (13,"N"), 35 (14,"O"), 36 (15,"P"), 37 (16,"Q"), 38 (17,"R"), 39 (18,"S"), 40 (19,"T"), 41 (20,"U"), 42 (21,"V"), 43 (22,"W"), 44 (23,"X"), 45 (24,"X"), 46 (25,"Y"), 47 (26,"Z") 48 ]) 49 choices=[ 50 (0,"A"), 51 (1,"B"), 52 (2,"C"), 53 (3,"D"), 54 (4,"E"), 55 (5,"F"), 56 (6,"G"), 57 (7,"H"), 58 (8,"I"), 59 (9,"J"), 60 (10,"K"), 61 (11,"L"), 62 (12,"M"), 63 (13,"N"), 64 (14,"O"), 65 (15,"P"), 66 (16,"Q"), 67 (17,"R"), 68 (18,"S"), 69 (19,"T"), 70 (20,"U"), 71 (21,"V"), 72 (22,"W"), 73 (23,"X"), 74 (24,"X"), 75 (25,"Y"), 76 (26,"Z") 77 ]

python

1# 下記は models.py です。 2from django.db import models 3from psycopg2.sql import NULL 4from django.template.defaultfilters import default 5 6 7class Artist(models.Model): 8 name = models.CharField(max_length=255) 9 genre1 = models.CharField(max_length=255, blank=True, null=True) 10 genre2 = models.CharField(max_length=255, blank=True, null=True) 11 genre3 = models.CharField(max_length=255, blank=True, null=True) 12 genre4 = models.CharField(max_length=255, blank=True, null=True) 13 genre5 = models.CharField(max_length=255, blank=True, null=True) 14 genre6 = models.CharField(max_length=255, blank=True, null=True) 15 genre7 = models.CharField(max_length=255, blank=True, null=True) 16 genre8 = models.CharField(max_length=255, blank=True, null=True) 17 genre9 = models.CharField(max_length=255, blank=True, null=True) 18 19class Genre(models.Model): 20 name = models.CharField(max_length=255) 21 created_at = models.DateTimeField(auto_now_add=True) 22 updated_at = models.DateTimeField(auto_now=True) 23 24class Songs(models.Model): 25 id = models.IntegerField 26 artist = models.CharField(max_length=255) 27 title = models.CharField(max_length=255) 28 free_download = models.BooleanField(default=False) 29 url = models.URLField(blank = True) 30 31class ArtistAndSongs(models.Model): 32 artist = models.ForeignKey(Artist, on_delete=models.CASCADE) 33 song = models.ForeignKey(Songs, on_delete=models.CASCADE) 34 35class ArtistAndGenre(models.Model): 36 artist = models.ForeignKey(Artist, on_delete=models.CASCADE) 37 genre = models.ForeignKey(Genre, on_delete=models.CASCADE)

html

1<!-- 以下は result.html です。 --> 2<h2>入力したアーティスト({{ name }})の属するジャンル一覧</h2> 3<h2>聴きたいジャンルをクリックしてください。</h2> 4{% for g in genres %} 5 {{ g }}<br> 6{% endfor %}

発生している問題

result.html で表示させているジャンル一覧をプルダウンで表示させたいです。(今度はジャンル一覧からさらに一つのジャンルを選択させたいので)
しかし、プルダウンメニューにaddアクションで生成した音楽ジャンルを表示させるにはどうすればいいのかわからないので、止まっています。

試したこと

ググった結果、関数(今回はaddアクション)内で生成した変数(今回はgenres)は、他のファイル(今回はforms.py)から参照できないことがわかりました。よって、formsでviewsの関数内の変数が参照できないと、formsでプルダウンに表示させるデータが設定できないのでは、というのが現在の認識です。

補足情報(FW/ツールのバージョンなど)

  • Python 3.6.5
  • Django 2.0.3

最後に

できるだけ情報と説明を詳しくしたつもりですが、足りない情報がありましたら、おっしゃってください。
追記いたします。

追記(2018/06/01 19:06)

以下のような画面表示になりました。

イメージ説明

出来ましたら、以下のようにしたいのですが、どうすればよろしいでしょうか。

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じでしょうかー?

result.html

html

1<select id="id_list" name="name_list"> 2 {% for g in genres %} 3 <option value="{{ g }}"> {{ g }}</option> 4 {% endfor %} 5</select>

投稿2018/06/01 09:04

kakimochi

総合スコア110

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

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

anvinon

2018/06/01 10:06

コメントありがとうございます!あともう一歩なのですが、ご存じないでしょうか? 画面表示がどのようになったかは、今から質問内容に追記して、画像をアップロードいたします。
kakimochi

2018/06/01 13:23

画像拝見しました。HTMLが下記のようになっていますね。 <option value="progressive technical metalcore" class> progressive technical metalcore </option> この部分で期待するのは、下記と思います。 <option value="progressive">progressive</option> <option value="technical">technical</option> <option value="metalcore">metalcore</option> そのためには、views.py で genre の中身がこれらの要素が入ったlistになってればよいです。 デバッグのため、views.pyの genreに代入されている部分で for item in genre: print(item) などして、中身を確認するとよいかもしれません。
anvinon

2018/06/01 21:30

kakimochi様 返信有難うございます。結論から申しますと、私が少し勘違いしていまして、先程の最初のご回答 で合っていました。 いずれにせよ、kakimochi様のご回答がなければ、ずっと開発が止まっていたままでした。 本当にありがとうございました。ベストアンサーに選ばせていただきます。
kakimochi

2018/06/04 01:52

ありがとうございます。 解決して、よかった~~。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問