从泛型列表视图中获取相关对象的信息

1 投票
1 回答
1001 浏览
提问于 2025-04-15 13:33

我最近在研究Django的通用视图,特别是object_list这个视图。在我的urls.py文件里,我有这样的设置:

from django.conf.urls.defaults import *
from django.views.generic import list_detail
from diplomacy.engine.models import Game

game_info = {
    "queryset": Game.objects.filter(state__in=('A', 'P')),
    "template_object_name": "game",
    }

urlpatterns = patterns('',
    (r'^$', list_detail.object_list, game_info),
)

然后我有一个比较粗糙的模板,它将会使用这个视图:

{% block content %}
  <table>
    <tr>
      <th>Name</th>
      <th>Turn</th>
      <th>Last Generated</th>
    </tr>
    {% for game in game_list %}
    <tr>
      <td>{{ game.name }}</td>
    </tr>
    {% endfor %}
  </table>
{% endblock %}

我想要的是在这个视图中,最好的方式是包含当前Game的最新Turn的unicode表示和generated字段(这是一个DateTimeField)。这个Turn是通过generated的值来判断的。Turn.game是指向这个Turn所属的Game的字段(这是一个ForeignKey)。

更新:

我的Turn模型如下:

SEASON_CHOICES = (
    ('S', 'Spring'),
    ('SR', 'Spring Retreat'),
    ('F', 'Fall'),
    ('FR', 'Fall Retreat'),
    ('FB', 'Fall Build')
    )

class Turn(models.Model):
    game = models.ForeignKey(Game)
    year = models.PositiveIntegerField()
    season = models.CharField(max_length=2, choices=SEASON_CHOICES)
    generated = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return "%s %s" % (self.season, self.year)

Game模型和我在另一个问题中描述的没有太大变化。

1 个回答

0

如果 Turn.game 指向相关的 Game 对象,那么 {{game.turn_set.all}} 应该会返回这个游戏的所有 Turn 对象。

你可能需要在 Turn 模型中添加一个 Meta 类,以便按从最新到最旧的顺序排列。

Class Meta:
    ordering = ['-generated']

然后,{{game.turn_set.all.0}} 应该会返回这个游戏最新的回合的 unicode 表示,而 {{game.turn_set.all.0.generated}} 则会返回相关的 datetime 对象。

注意:这段代码没有经过测试。

撰写回答