Django - 重组的意外输出

时间:2014-05-14 19:15:59

标签: django django-templates django-views

这是对早期问题的编辑:我认为重新组合是我在这里寻找的,但邀请任何建议采用不同的方法。我正在尝试为多人 - 步步高游戏(称为chouette)的得分应用程序生成一个html表。典型的评分表最终会看起来像this

就目前而言,我已经省去了胜利/失败"列,这将是一个计算值,我稍后会担心如何让位置和分数标题在播放器标题下排成一行。

在下面的代码中,我尝试使用重新组合输出显示第一列游戏编号的行,然后为该游戏的每个玩家分数和位置。但是,输出会继续为每个游戏为每个游戏生成新行,如here所示。我在视图中按游戏订购,所以我不明白他们为什么不进行分组。

型号:

class Chouette(models.Model):
    date = models.DateTimeField()
    location = models.CharField(max_length=100)
    stake = models.IntegerField()

    def __unicode__(self) :
        return unicode(self.id)


class Position(models.Model):
    POSITION_CHOICES = (
    ('b', 'b'),
    ('c', 'c'),
    ('2', '2'),
    ('3', '3'),
    ('4', '4'),
    ('5', '5'),
    ('6', '6'),
    ('7', '7'),
    ('8', '8'),
    )
    position = models.CharField(max_length=10, choices=POSITION_CHOICES)

    def __unicode__(self) :
        return unicode(self.position)

class Player(models.Model):
    user = models.OneToOneField(User)
    handle = models.CharField(max_length=10)

    def __unicode__(self) :
        return unicode(self.handle)

class Game(models.Model):
    number = models.IntegerField()
    chouette = models.ForeignKey(Chouette)        

    def __unicode__(self) :
        return unicode(self.number)

class Score(models.Model):
    game = models.ForeignKey(Game)
    player = models.ForeignKey(Player)
    position = models.ForeignKey(Position)
    score = models.IntegerField()

查看:

from django.shortcuts import render
from chouette.models import Score, Game

#chouette=1

def scores(request):
    p_list = Score.objects.filter(game__chouette=1).distinct('player').order_by('player')
    s_list = Score.objects.filter(game__chouette=1).order_by('game','player')
    return render(request, 'scores.html', {'player_list': p_list, 'score_list': s_list})

模板:

<!doctype html>
<html>
    <head></head>
    <body>
    <table>
        <tr>
        {% for player in player_list %}
            <th>{{ player.player }}</th>
        {% endfor %}
        </tr><tr>
        <th>Game</th>
        {% for player in player_list %}
            <th>Score</th><th>Position</th>
        {% endfor %}
        {% regroup score_list by game as list_by_game %}
            {% for game in list_by_game %}
            <tr><td>{{ game.grouper }}</td>
                    {% for g in game.list %}
                    <td>{{ g.score }}</td>
                    <td>{{ g.position }}</td>
                    {% endfor %}   
            {% endfor %}</tr>
        </table> 
    </body>
    </html>

感谢任何帮助以及您对Django新手的耐心。

1 个答案:

答案 0 :(得分:0)

问题在于Django管理员的默认表单设置方式,它为每个分数创建了一个新游戏pk;改变形式,使每场比赛只有一个PK。

仍然不确定重新组合是我问题的最佳解决方案,因为它迫使我为有一些但不是所有游戏得分的玩家插入空或空记录,以便在右栏下显示其他分数。