FlaskFM Playlist titles

I have been working on FlaskFM but am now having issues getting my representation for my Item class to show up the way I want it to. I’d like for under “Your current playlist” the actual song name to show up. Since the Item class doesn’t include this as per the instructions, I tried adding this into my database by adding a foreign key. However, when I do this, it just renders as “None.” Has anyone gotten to get this to display properly?

routes.py:

from app import app, db

#the User model: each user has a username, and a playlist_id foreign key referring
#to the user's Playlist
class User(db.Model):
  id = db.Column(db.Integer, primary_key = True)
  username = db.Column(db.String(50), index = True, unique = True) 
  playlist_id = db.Column(db.Integer,  db.ForeignKey('playlist.id'))
  
  #representation method
  def __repr__(self):
        return "{}".format(self.username)

#create the Song model here + add a nice representation method
class Song(db.Model):
  id = db.Column(db.Integer, primary_key = True)    
  title = db.Column(db.String(50), index = True, unique = True)
  artist = db.Column(db.String(50), index = True, unique = True)
  n = db.Column(db.Integer, index = False, unique = False)
  #representation method
  def __repr__(self):
        return "{} by {}".format(self.title, self.artist)

#create the Item model here + add a nice representation method
class Item(db.Model):
  id = db.Column(db.Integer, primary_key = True)
  song_id = db.Column(db.Integer, db.ForeignKey('song.id'))  
  playlist_id = db.Column(db.Integer, db.ForeignKey('playlist.id'))
  title_two = db.Column(db.String(50), db.ForeignKey('song.title'))
#create the Playlist model here + add a nice representation method
  def __repr__(self):
        return "{}".format(self.title_two)
class Playlist(db.Model):
  id = db.Column(db.Integer, primary_key = True)
  items = db.relationship('Item', backref='playlist', lazy='dynamic')

app,py:

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
#import SQLALchemy

app = Flask(__name__)
#set the SQLALCHEMY_DATABASE_URI key
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///song_library.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'you-will-never-guess'
#create an SQLAlchemy object named `db` and bind it to your app
db = SQLAlchemy(app)
#a simple initial greeting
@app.route('/')
@app.route('/index')
def greeting():
    return render_template('greeting.html')

# app name 
@app.errorhandler(404) 
def not_found(e): 
  return render_template("404.html") 

#uncomment the code below here when you are done creating database instance db and models
import routes

from models.py:

from flask import Flask

from flask_wtf import FlaskForm

from wtforms import StringField, SubmitField

from wtforms.validators import DataRequired

from app import app, db

from models import User, Song, Playlist, Item

from flask import render_template, request, url_for, redirect, flash

#A form for inputing new songs via Dashboard

class SongForm(FlaskForm):

  title = StringField(label = "Song Title:", validators=[DataRequired()])

  artist = StringField(label = "Artist:", validators=[DataRequired()])

  submit = SubmitField("Add Song")

#A function we made to check if an item to be added is already in the playlist

def exists(item, playlist):

  """Return a boolean

    True if playlist contains item. False otherwise.

    """

  for i in playlist: #for each item in playlist

    if i.song_id == item.song_id: #check if the primary key is equal

       return True

  return False

#The home page of FlaskFM

#Lists all the users currently in the database

#renders the home.html template providing the list of current users

@app.route('/profiles')

def profiles():

    current_users = User.query.all() #change here to a database query

    return render_template('users.html', current_users = current_users)

#Displays profile pages for a user with the user_id primary key

#renders the profile.html template for a specific user, song library and 

#the user's playlist 

@app.route('/profile/<int:user_id>')

def profile(user_id):

   user = User.query.filter_by(id = user_id).first_or_404(description = "No such user found.")

   songs = Song.query.all()

   which_user = User.query.get(user_id)

   my_playlist = Playlist.query.get(which_user.playlist_id) #change here to a database query

   return render_template('profile.html', user = user, songs = songs, my_playlist = my_playlist)

#Adds new songs to a user's playlist from the song library

#redirects back to the profile that issued the addition

@app.route('/add_item/<int:user_id>/<int:song_id>/<int:playlist_id>')

def add_item(user_id, song_id, playlist_id):

   new_item = Item(song_id = song_id, playlist_id = playlist_id)

   user = User.query.filter_by(id = user_id).first_or_404(description = "No such user found.")

   my_playlist = Playlist.query.filter_by(id = user.playlist_id).first()

   if not exists(new_item, my_playlist.items):

      song = Song.query.get(song_id)

      #using db session add the new item

      db.session.add(new_item)

      song.n = song.n + 1

      db.session.commit()

      #increase the counter for the song associated with the new item

      #commit the database changes here

   return redirect(url_for('profile', user_id = user_id))

#Remove an item from a user's playlist

#Redirects back to the profile that issues the removal

@app.route('/remove_item/<int:user_id>/<int:item_id>')

def remove_item(user_id, item_id):

   object_to_remove = Item.query.get(item_id)

   db.session.delete(object_to_remove)

   db.session.commit()

   #from the Item model, fetch the item with primary key item_id to be deleted

   #using db.session delete the item

   #commit the deletion

   return redirect(url_for('profile', user_id = user_id))

   

#Display the Dashboard page with a form for adding songs

#Renders the dashboard template

@app.route('/dashboard', methods=["GET", "POST"])

def dashboard():

  form = SongForm()

  if request.method == 'POST' and form.validate():

    new_song = Song(title = form.title.data, artist = form.artist.data, n = 1)

    #create a new song here

    #add it to the database

    #commit to the database

  else:

        flash(form.errors)

  unpopular_songs = []  #add the ordering query here

  songs = Song.query.all()

  return render_template('dashboard.html', songs = songs, unpopular_songs = unpopular_songs, form = form)

This worked for me to display the track titles and artists in the playlist.

class Item(db.Model):
  id = db.Column(db.Integer, primary_key = True)    
  song_id = db.Column(db.Integer, db.ForeignKey('song.id'))
  playlist_id = db.Column(db.Integer, db.ForeignKey('playlist.id'))
  def __repr__(self):
    song = Song.query.get(self.song_id)
    return "{} by {}".format(song.title, song.artist)