Day 17 可以搜尋名稱,今天則讓使用者依照分類找作品,例如科幻電影或動作遊戲。
步驟 1:修改電影與遊戲路由
在兩個路由中新增:
genre = request.args.get("genre", "").strip()
然後在 SQL 的 ORDER BY 之前加入:
if genre: query += " AND genre = ?" params.append(genre)
傳入模板時也加入:
selected_genre=genre
這裡使用完全比對,代表只有分類欄位等於所選值的作品才會出現。
步驟 2:在 collection.html 加入分類選單
在原本的搜尋表單中加入:
作品分類
全部分類
{% for genre_name in genres %}
<option value="{{ genre_name }}"
{% if selected_genre == genre_name %}selected{% endif %}>
{{ genre_name }}
</option>
{% endfor %}
步驟 3:由資料庫取得分類清單
在電影與遊戲路由執行完 items 查詢後、關閉連線前,加入:
genres = connection.execute(""" SELECT DISTINCT genre FROM media WHERE media_type = ? AND genre IS NOT NULL AND TRIM(genre) != '' ORDER BY genre""", (media_type,)).fetchall()
因為電影與遊戲路由各自有不同的類型,可以分別傳入:
media_type="movie"
或:
media_type="game"
然後在 render_template() 中傳入:
genres=[row["genre"] for row in genres]
步驟 4:測試
新增幾部不同分類的作品,例如: