【发布时间】:2020-10-21 04:32:30
【问题描述】:
我在将数据从 Django 模型传递到 Django 模板时遇到问题。下面的代码有效,但我觉得它看起来很笨拙,我对它为什么有效感到有点困惑。我正在尝试从我的数据库中为我的每个模型读取一个随机条目。然后我想在我的主页模板上打印每个模型的数据。我以为我可以将每个模型添加到单个字典中,然后遍历模板中的字典字典,但这不起作用(我知道模型有不同的字段,但我计划稍后解决这个问题)。我玩了一会儿,意识到我的 for 循环实际上并没有遍历字典字典,而实际上只是通过它的键读取字典中的每个单独条目。此外,for 循环似乎没有进行任何迭代,因为我可以使用 .field 表示法直接访问模型的字段。这似乎是唯一有效的方法,但我仍然不完全确定为什么。任何人都可以澄清为什么这样做,或者让我知道是否有更直接的方式来阅读字典?这是呈现模板的函数:
def home(request):
# Get a random song and album from the database
randomSong = randint(1,501)
randomAlbum = randint(1,501)
songChoice = Songs.objects.filter(rank = randomSong).values()
albumChoice = Albums.objects.filter(rank = randomAlbum).values()
entry = {'ent': songChoice, 'entry': albumChoice}
return render(request,'rollingStone/home.html', entry)
这是 home 渲染的模板:
{% extends "rollingStone/layout.html" %}
{% block title %}
A Record A Day
{% endblock %}
{% block body %}
{% for song in ent %}
<div class = "container">
<div class = "row">
<h1>#{{song.rank}}: {{song.title}} </h1>
</div>
<div class = "row ">
<div class = "col-sm">
<img src = {{song.cover}} alt = "No cover">
</div>
<div class = "col-sm">
<p>
<strong>{{song.releaseInfo}}</strong>
<br>
<br>
<strong>Artist:</strong> {{song.artist}}
<br>
<strong>Writer(s):</strong> {{song.writers}}
<br>
<strong>Producer(s):</strong> {{song.producer}}
<br>
<br>
{{song.description}}
</p>
</div>
</div>
</div>
{% endfor %}
{% for album in entry %}
<div class = "container">
<div class = "row">
<h1>#{{album.rank}}: {{album.title}} </h1>
</div>
<div class = "row ">
<div class = "col-sm">
<img src = {{album.cover}} alt = "No cover">
</div>
<div class = "col-sm">
<p>
<strong>Artist:</strong> {{album.artist}}
<br>
<strong>Label:</strong> {{album.label}}
<br>
<strong>Release Year:</strong> {{album.year}}
<br>
<br>
{{album.description}}
</p>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
以及模型本身的定义,如果有帮助的话:
# Model to store a Rolling Stone top 500 song
class Songs(models.Model):
rank = models.IntegerField()
artist = models.CharField(max_length=50)
title = models.CharField(max_length=50)
cover = models.ImageField()
writers = models.CharField(max_length=100)
producers = models.CharField(max_length=100)
releaseInfo = models.CharField(max_length=100)
description = models.TextField()
used = models.BooleanField(default=False)
def __str__(self):
return self.title
# Model to store a Rolling Stone top 500 album
class Albums(models.Model):
rank = models.IntegerField()
artist = models.CharField(max_length=50)
title = models.CharField(max_length=50)
cover = models.ImageField()
label = models.CharField(max_length=100)
year = models.CharField(max_length=100)
description = models.TextField()
used = models.BooleanField(default=False)
def __str__(self):
return self.title
【问题讨论】:
标签: django django-views django-templates