访问模板中的foreignKey

时间:2010-01-13 10:38:35

标签: django django-models django-templates

好吧,这很简单。 2个具有ManyToMany关系的模型:

class Artist(models.Model):
   name = models.CharField(max_length=100, unique=True)
   slug = models.SlugField(max_length=100, unique=True,
            help_text='Uniq value for artist page URL, created from name')
   birth_name = models.CharField(max_length=100, blank=True)


class Song(models.Model):
   title = models.CharField(max_length=255)  
   slug = models.SlugField(max_length=255, unique=True,
            help_text='Unique value for product page URL, create from name.')
   youtube_link = models.URLField(blank=False)
   artists = models.ManyToManyField(Artist)

我的观点是假设要显示最新的5首歌曲:

def songs(request, template_name="artists/songs.html"):
   song_list = Song.objects.all().order_by('-created_at')[:5]
   return render_to_response(template_name, locals(),
                          context_instance=RequestContext(request))

问题出在模板中......我想显示艺术家姓名 但我真的不知道该怎么做,我试过了:

{% for song in song_list %}
    {{ artists__name }} - {{ song.title }} 
{% endfor %}  

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:7)

尝试将模板代码更改为:

{% for song in song_list %}
  {% for artist in song.artists.all %}
    {{ artist.name }} - {{ song.title }} 
  {% endfor %}
{% endfor %}  

答案 1 :(得分:1)

artists是另一种类型的管理员,因此您必须遍历artists.all并打印每个元素的name属性。

答案 2 :(得分:1)

好吧,我研究了@Dominic Rodger 先生的上述解决方案,但是因为我使用的是 Django 3.2 版,所以它对我不起作用。因此,问题可能保持不变,但根据 Django 版本的变化,解决它们的方式有时会有所不同。如果您使用的是 Django 3.x,请使用以下解决方案。

在views.py中

def songs(request):
   song_list = Song.objects.all().order_by('-created_at')[:5]
   song_list = {'song_list':song_list}
   return render(request, 'artists/songs.html', song_list)

在您的 HTML 模板中使用下面的代码

<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
    <thead>
        <tr>
            <th>Artist - Song Title</th>
        </tr>
    </thead>
        <tbody>
            {% for song in song_list %}
            </tr>
                <td>{{ song.artist.name }} - {{ song.title }}</td> 
            <tr>
            {% endfor %}
        </tbody>
</table> 

在 urls.py 中

path('songs/', views.songs, name='songs'),

如果您从 localhost 运行源代码,请在浏览器中输入 http://127.0.0.1:8000/songs/

谢谢....