前提・実現したいこと
DjangoでYpuTubeのようなシステムを作っています。
検索キーワードで動画タイトルを一覧表示し、タイトルをクリックすると動画のDetaileページに飛ぶようにしたいです。
発生している問題・エラーメッセージ
YouTube APIから取得したタイトルとIDを紐付けることができません。
HTML内の動画タイトルにアンカータグをつけ、リンク先のdetaileページに動画タイトルに紐づく動画IDを渡すような機能を実現したいです。
該当のソースコード
views.py
from django.shortcuts import render from .search import search def top_search(request): return render(request, "youtube/search.html") def index(request): keyword = request.GET.get("keyword") videos_name, videos_id = search(keyword) videos = { 'videos_name':videos_name, 'videos_id':videos_id } return render(request, "youtube/search_list.html", videos) def detaile(request, video_id): return render(request, "youtube/detaile.html",{"video_id":video_id})
search_list.html
{% extends "youtube/base.html" %} {% block content %} <header> <h1>検索結果</h1> </header> {% for name in videos_name %} <div> <a href="{% url 'youtube:detail' id=videos_id %}">{{ name }}</a> </div> {% endfor %} {% endblock %}
試したこと
上記コードのままでは、Detaileページにvideos_idのリストが渡されてしまいます。
HTML内のfor
にてpythonのzip関数も試してみましたが、うまくいきませんでした。
HTMLには辞書型で変数が渡されていると思い、
{% extends "youtube/base.html" %} {% block content %} <header> <h1>検索結果</h1> </header> {% for name,id in videos.values() %} <div> <a href="{% url 'youtube:detail' id=id %}">{{ name }}</a> </div> {% endfor %} {% endblock %}
のようにしてみましたが、これもうまくいきませんでした。
実現したいことは、リスト表示された動画タイトルをクリックすると、YoutubeのようにDetaileページに飛ぶような設計です。
ご教授お願いします。
補足情報(FW/ツールのバージョンなど)
Python 3.6.5 Django==2.1.1
###補足
views.py
内のsearch関数はYouTubeAPIの公式(https://developers.google.com/youtube/v3/code_samples/python?hl=ja#search_by_keyword)のコードを流用しました。
search.py
from apiclient.discovery import build from apiclient.errors import HttpError from oauth2client.tools import argparser from .youtube_data_model import YouTubeData DEVELOPER_KEY = "MY_DEVELOPER_KEY" YOUTUBE_API_SERVICE_NAME = "youtube" YOUTUBE_API_VERSION = "v3" def youtube_search(options): youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY) saerch_response = youtube.search().list( q=options.q, part="id,snippet", maxResults=options.max_results ).execute() videos_name = [] videos_id = [] for saerch_result in saerch_response.get("items", []): if saerch_result["id"]["kind"] == "youtube#video": videos_name.append(saerch_result["snippet"]["title"]) videos_id.append(saerch_result["id"]["videoId"]) return videos_name, videos_id def search(keyword): ytdata = YouTubeData(q=keyword, max_results=10) try: return youtube_search(ytdata) except HttpError as e: print("An HTTP error %d occurrede::\n%s" % (e.resp.status, e.content))
youtube_data_model.py
class YouTubeData(): def __init__(self, q, max_results): self.q = q self.max_results = max_results
戻り値は動画タイトルと動画IDのリストです。
戻り値はvideos_name
,videos_id
の順番で戻っており、views.py
内においても、videos_name
,videos_id
は正しい値が格納されていることは確認できています。
回答1件
あなたの回答
tips
プレビュー