Django模板表格式化

时间:2012-09-26 06:01:12

标签: django

我正在构建学生测试结果模板,但遇到了问题。目前我在我的测试模型中创建了2个测试(数学和拼写)。问题是,如果我首先为学生输入第二次测试(拼写)的数据(分数),则分数会错误地放在模板中 - 分数将放在“数学”列中而不是“拼写”列中。一旦我在数学测试中输入相同的学生姓名,它就会被纠正/移动到拼写栏中。这是一个小问题,但结果仍然放在错误的地方,我不知道为什么。

我一定是做错了。我想我错过了某种过滤。希望下面的代码有助于进一步解释它。感谢。

Models.py

    class Student(models.Model):
        first = models.CharField(max_length=100)
        last = models.CharField(max_length=100)
        gender = models.CharField(max_length=1)
        teacher = models.ForeignKey(Teacher)

        def __unicode__(self):
              return "%s %s" % (self.first, self.last)


    class Test(models.Model):
        name = models.CharField(max_length=100)
        Out_of = models.IntegerField(null=True, blank=True)

        def __unicode__(self):
            return self.name

        class Meta:
            ordering = ['name']



    class Display(models.Model):
        name = models.ForeignKey(Student, related_name='art')
        test = models.ForeignKey(Test)
        one = models.IntegerField(null=True, blank=True)
        two = models.IntegerField(null=True, blank=True)
        three = models.IntegerField(null=True, blank=True)

# views.py
    def test(request):

    return list_detail.object_list(
          request,
          queryset = Student.objects.all(),
          template_name = 'display.html',
          template_object_name = 'results',

# display.html

    <table>

    <tr>
        <th>First</th>
        <th>Name</th>
        <th>Maths</th>
        <th>Spelling</th>
    </tr>
    {% for item in results_list %}

    <tr>
              <td> {{ item.first }} </td>
              <td> {{ item.last }} </td>

        {% for x in item.art.all %}
              <td> {{ x.one }} </td>

        {% endfor %}

    {% endfor %}
        </tr>

    </table>

# admin.py
    class StudentInline(admin.TabularInline):
        model = Display


    class TestAdmin(admin.ModelAdmin):
        inlines = [StudentInline]

1 个答案:

答案 0 :(得分:0)

问题是你需要以某种方式按照表格列的顺序(即数学数字然后拼写)排序item.art.all()。当只添加一个测试结果时,还需要处理案例。 但是没有直接的方法来实现这一点,你不能在ordering类中拥有Meta的外键(或关系)成员。

因此,Display模型中的方法可以按首选顺序返回列表,并从模板中调用它。

以下示例解决方案:

class Student(models.Model):
        first = models.CharField(max_length=100)
        last = models.CharField(max_length=100)
        gender = models.CharField(max_length=1)
        teacher = models.ForeignKey(Teacher)
    def __unicode__(self):
          return "%s %s" % (self.first, self.last)

    #this would return in order as math, spelling
    def get_result_list_in_order(self):
        rlist = []
        for tname in ['math', 'spelling']:
            rtest = self.art.filter(test__name__iexact=tname)
            if rtest:
               rlist.append(rtest[0])  #add the first entry from filtered queryset
               # or do
               #rlist.extend(rtest)
            else
               rlist.append(None)

        return rlist

所以你可以在模板中使用

{% for x in item.get_result_list_in_order %}
    <td> {{x.one}} </td>
{% endfor %}