Django模板表格式
我正在建立一个学生测试结果模板,但有一个问题。目前,我已经在我的测试模型中创建了两个测试(数学和拼写)。问题是,如果我先为一个学生输入第二次测试(拼写)的数据(分数),那么分数在模板中的位置就不正确了——分数被放在数学列而不是拼写列中。当我在数学考试中输入同一个学生的名字时,它就会被更正/移到拼写栏。这是一个小问题,但结果仍然被放在错误的地方,我不知道为什么 我一定是做错了什么。我想我错过了某种过滤。希望下面的代码将有助于进一步解释它。谢谢 Models.pyDjango模板表格式,django,Django,我正在建立一个学生测试结果模板,但有一个问题。目前,我已经在我的测试模型中创建了两个测试(数学和拼写)。问题是,如果我先为一个学生输入第二次测试(拼写)的数据(分数),那么分数在模板中的位置就不正确了——分数被放在数学列而不是拼写列中。当我在数学考试中输入同一个学生的名字时,它就会被更正/移到拼写栏。这是一个小问题,但结果仍然被放在错误的地方,我不知道为什么 我一定是做错了什么。我想我错过了某种过滤。希望下面的代码将有助于进一步解释它。谢谢 Models.py 班级学生(models.Model
班级学生(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
notDisplay
中。请立即查看更新的代码。再次感谢您的帮助。正如建议的那样,我已进行了更改。由于某些原因,我仍然无法使其工作。我已将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 %}