【问题标题】:Django template reading individual keys from dictionary instead of iteratingDjango模板从字典中读取单个键而不是迭代
【发布时间】: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


    【解决方案1】:

    之所以有效,是因为您正在过滤和检索.values(),这意味着它返回的查询集可能为 1。

    换句话说,{% for song in ent %} 等价于 for song in ent_queryset。 如果您更改过滤器以检索多首歌曲/专辑,您会看到不止一首歌曲/专辑出现。

    如果您只想检索一首歌曲/专辑,那么您需要执行以下操作:

    songChoice = Songs.objects.filter(rank = randomSong).values().first()
    albumChoice = Albums.objects.filter(rank = randomAlbum).values().first()
    entry = {'ent': songChoice, 'entry': albumChoice}
    return render(request,'rollingStone/home.html', entry)
    

    然后在您的模板中您可以直接访问它们:

    {{ ent }} # this is your song obj
    {{ ent.writers }}
    {{ ent.artist }}
    {{ entry }}  # this is your album entry 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-28
      • 2012-07-27
      • 2021-01-16
      • 2013-10-11
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      相关资源
      最近更新 更多