【问题标题】:For Loop in Django template just repeats the last value in dictionaryDjango 模板中的 For Loop 只是重复字典中的最后一个值
【发布时间】:2021-03-09 21:55:39
【问题描述】:

我正在从我在模板中循环的 API 接收数据。除了日期之外,每个值都很好。

因为模板无法将日期格式化为字符串,所以我在视图中对其进行了格式化(如下所示)。但是现在当我将该 datetime 变量传递给我的模板时,它只会为每次迭代显示相同的日期,其他所有值都是正确的。

我怎样才能正确地迭代日期?

谢谢!

    for game in games:
        date = game['schedule']['date']
        datetime_date = datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%fZ')
        game_date = datetime_date.strftime('%B %d, %Y')
        game_time = datetime_date.strftime('%-I:%M %p')
        
    context = {
        'games': games,
        'game_date': game_date,
        'game_time': game_time
    }

    return render(request, 'games/games.html', context)
    {% for game in games %}    
          <div class="col-12 col-lg-6 mb-4">
              <div class="gamecard p-2">
                   <div class="row">
                        <div class="col-12">
                             <h3 class="game-summary white opacity-90 text-center font-800 mb- 
                                       0">{{ game.summary }}
                             </h3>
                             <p class="white opacity-90 mb-0 text-center">
                                   {{ game_date }} 
                                   {{ game_time }}
                             </p>
                             <p class="white opacity-90 mb-2 text-center"><small>
                                {{ game.venue.name }} - {{ game.venue.city }},
                                {{ game.venue.state }}</small>
                             </p>
                        </div>    
                  </div>    
                     
    {% endfor %}

【问题讨论】:

  • 您好先生,游戏模型有game_date和game_time字段吗?该值始终相同,因为您正在设置 'game_date': game_date 并且 game_date 是一个值而不是列表或属性
  • 日期本质上是通过 for 循环运行两次。一次,我可以在我的视图中格式化它,然后在我的模板中再次格式化。我不知道如何格式化和传递它。

标签: python django datetime


【解决方案1】:

问题是在你的循环中,在视图中:

for game in games:
    date = game['schedule']['date']
    datetime_date = datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%fZ')
    game_date = datetime_date.strftime('%B %d, %Y')
    game_time = datetime_date.strftime('%-I:%M %p')

你不断覆盖变量game_dategame_time的值),(还有datedatetime_date,但这些并不重要,因为它们只是暂时的您不在循环外使用的值),等等。所以不可避免地,当您稍后访问它时 - 在模板中,碰巧 - 它具有从 games 数组的最后一个元素计算的值。

从您的模板中,您显然不希望这些是单个变量,每个变量都包含一个值 - 您希望它们以不同的值存在于列表的 每个 元素中。由于每个game 显然都是一个字典,因此最简单的方法是简单地将数据添加到具有您需要的属性的那些字典中。

for game in games:
    date = game['schedule']['date']
    datetime_date = datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%fZ')
    game['game_date'] = datetime_date.strftime('%B %d, %Y')
    game['game_time'] = datetime_date.strftime('%-I:%M %p')

然后在模板中,而不是

{{ game_date }}
{{ game_time }}

像这样使用它:

{{ game.game_date }}
{{ game.game_time }}

【讨论】:

  • 啊啊啊啊……你真是个天才!非常感谢,工作就像一个魅力:)
【解决方案2】:

传递您的日期而不进行格式化,然后在您的模板中尝试这个..

{{game_date|date 'd-m-Y'}}

【讨论】:

  • 不起作用,因为它以字符串的形式出现,而 Django 无法对其进行格式化。
  • 为什么要格式化为字符串?什么时候可以用作日期对象
  • 它来自字典作为一个字符串。我必须将其格式化为日期时间对象,这就是我遇到问题的地方。
  • 好的。格式化,然后在模板中尝试我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多