Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模板表格式_Django - Fatal编程技术网

Django模板表格式

Django模板表格式,django,Django,我正在建立一个学生测试结果模板,但有一个问题。目前,我已经在我的测试模型中创建了两个测试(数学和拼写)。问题是,如果我先为一个学生输入第二次测试(拼写)的数据(分数),那么分数在模板中的位置就不正确了——分数被放在数学列而不是拼写列中。当我在数学考试中输入同一个学生的名字时,它就会被更正/移到拼写栏。这是一个小问题,但结果仍然被放在错误的地方,我不知道为什么 我一定是做错了什么。我想我错过了某种过滤。希望下面的代码将有助于进一步解释它。谢谢 Models.py 班级学生(models.Model

我正在建立一个学生测试结果模板,但有一个问题。目前,我已经在我的测试模型中创建了两个测试(数学和拼写)。问题是,如果我先为一个学生输入第二次测试(拼写)的数据(分数),那么分数在模板中的位置就不正确了——分数被放在数学列而不是拼写列中。当我在数学考试中输入同一个学生的名字时,它就会被更正/移到拼写栏。这是一个小问题,但结果仍然被放在错误的地方,我不知道为什么

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

Models.py
班级学生(models.Model):
第一个=models.CharField(最大长度=100)
last=models.CharField(最大长度=100)
性别=models.CharField(最大长度=1)
教师=模型。外键(教师)
def ___; unicode(自):
返回“%s%s%”(self.first,self.last)
类别测试(models.Model):
name=models.CharField(最大长度=100)
Out\u of=models.IntegerField(null=True,blank=True)
def ___; unicode(自):
返回self.name
类元:
排序=['name']
类显示(models.Model):
name=models.ForeignKey(学生,相关_name='art')
测试=型号。外键(测试)
one=models.IntegerField(null=True,blank=True)
两个=模型.IntegerField(null=True,blank=True)
三个=模型.IntegerField(null=True,blank=True)
#views.py
def测试(请求):
返回列表\详细信息。对象\列表(
要求
queryset=Student.objects.all(),
模板名称='display.html',
模板\对象\名称='结果',
#display.html
弗斯特
名称
数学
拼写
{results_list%中的项的%s}
{{item.first}
{{item.last}}
{item.art.all%中x的%s}
{{x.one}
{%endfor%}
{%endfor%}
#管理员
班级学生在线(管理员列表在线):
模型=显示
类TestAdmin(admin.ModelAdmin):
inlines=[StudentInline]

问题在于,您需要以某种方式将
项.art.all()
按与表列相同的顺序排序(即,先是数学数字,然后是拼写)。还需要处理仅添加一个测试结果的情况。 但是没有直接的方法来实现这一点,您不能在
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 %}
{item.get_result_list_中x的%u顺序%}
{{x.one}
{%endfor%}

感谢Rohan的回复。我尝试了你的解决方案,得到的只是一张空白表。我确保正确拼写这行代码中的名称,但在['math','spelling']中仍然没有tname的运气:.x.name不会向模板返回测试的名称,而不会返回存储在x.one中的数字?@TomFin,哦,是的,应该是
{x.one}
。您的测试名称是否与“数学”和“拼写”完全匹配?@TomFin,而且,该方法应该在
Student
not
Display
中。请立即查看更新的代码。再次感谢您的帮助。正如建议的那样,我已进行了更改。由于某些原因,我仍然无法使其工作。我已将assert设置为False以显示变量值和d这就是它们:t名称'Spelling'self rlist[[],[]rtest[]我知道我已经按照这里证明的正确拼写了名称。我只是无法显示测试值。它们仍然为空。我只能在执行{{x}操作时返回一些内容。它只返回[]在每个表单元格中。@TomFin是否显示
对象在'one
中有值?还可以尝试在添加函数的for循环中打印
rtest.one'。在那里打印的值和在表中打印的值应该匹配。
{% for x in item.get_result_list_in_order %}
    <td> {{x.one}} </td>
{% endfor %}