【发布时间】:2014-08-10 20:32:27
【问题描述】:
我正在创建一个演示 Django 网站,您可以在其中浏览 Billy Joel 的专辑。您可以点击专辑查看所有歌曲。
(如果它恰好在:http://104.131.200.120/albums/all/--目前几乎没有任何数据。只有冷泉港的一首歌,一个无辜的人没有)
我不知道如何在专辑页面中显示歌曲名称。它可以判断是否存在一首歌,因为冷泉港会打印出一个空的“名称/描述”行,而一个无辜的人则不会。
这是风景
def album(request, album_id=1):
album = Album.objects.get(id=album_id)
album_songs = AlbumSong.objects.filter(id=album_id)
print(str(album_songs))
return render_to_response("album.html",
{"album": album, "album_songs" : album_songs})
(the print results in [<AlbumSong: Cold Spring Harbor: 10: Got To Begin Again>] being written to the console, when Cold Spring Harbor is selected.)
模型(注意 Song 和 Album 模型没有外键链接。有一个中间表 AlbumSong):
from django.db import models
from django.contrib.auth.models import User
from time import time
def get_upload_file_name(instance, filename):
return "uploaded_files/%s_%s" % (str(time()).replace(".", "_"), filename)
class Album(models.Model):
title = models.CharField(max_length=70)
pub_date = models.DateField('release date')
is_official = models.BooleanField(default=False)
is_concert = models.BooleanField(default=False)
likes = models.IntegerField(default=0)
thumbnail = models.FileField(upload_to=get_upload_file_name, blank=True, null=True)
def __str__(self):
return self.title
class Song(models.Model):
name = models.CharField(max_length=100)
sub_name = models.CharField(max_length=200, null=True, blank=True)
length_seconds = models.IntegerField()
lyrics_url = models.TextField(default="", blank=True, null=True)
def __str__(self):
return self.name
class AlbumSong(models.Model):
song_id = models.ForeignKey(Song)
album_id = models.ForeignKey(Album)
sequence_num = models.IntegerField()
class Meta:
unique_together = ('album_id', 'sequence_num',)
unique_together = ('album_id', 'song_id',)
def __str__(self):
return str(self.album_id) + ": " + str(self.sequence_num) + ": " + str(self.song_id)
class FavoriteSongs(models.Model):
user_id = models.ForeignKey(User)
song_id = models.ForeignKey(Song)
sequence_num = models.IntegerField()
class Meta:
unique_together = ('user_id', 'song_id',)
unique_together = ('user_id', 'sequence_num',)
def __str__(self):
return "user=" + str(self.user_id) + ", song=" + str(self.song_id) + ", number=" + str(self.sequence_num)
class FavoriteAlbums(models.Model):
user_id = models.ForeignKey(User)
album_id = models.ForeignKey(Album)
sequence_num = models.IntegerField()
class Meta:
unique_together = ('user_id', 'album_id',)
unique_together = ('user_id', 'sequence_num',)
def __str__(self):
return "user=" + str(self.user_id) + ", album=" + str(self.album_id) + ", number=" + str(self.sequence_num)
和模板:
{% extends "base.html" %}
{% block title %}Album detail{% endblock %}
<!-- <div id="sidebar"> -->
{% block sidebar %}
<UL>
<LI><a href="/albums/all">Albums</A></LI>
</UL>
{% endblock %}
<!-- </div> -->
{% block content %}
<H1>{{ album.title }}</H1>
<P>{{ album.body }}</P>
{% if album.thumbnail %}
<P><img src="/static/{{ album.thumbnail }}" width="200"/></P>
{% endif %}
<P><UL>
<LI>Released: {{ album.pub_date }}</LI>
<LI>Official: {{ album.is_official }}</LI>
<LI>Concert: {{ album.is_concert }}</LI>
</UL></P>
<H2>Songs</H2>
{% for album_song in album_songs %} <!-- No colon after "album_songs" -->
<div>
<P><UL>
<LI>Name: <a href="/songs/get/{{ song.id }}">{{ album_song.song.name }}</a><UL>
<LI>Description: {{ album_song.song.sub_name }}</LI>
</UL></LI>
</UL></P>
</div>
{% endfor %}
<P><a href="/albums/like/{{ album.id }}">Like this album</A> -- {{ album.likes }} people liked this album.</P>
{% endblock %}
如何在模板中显示歌曲名称? album_song.song.name应该改成什么?
谢谢。
【问题讨论】: