我正在构建学生测试结果模板,但遇到了问题。目前我在我的测试模型中创建了2个测试(数学和拼写)。问题是,如果我首先为学生输入第二次测试(拼写)的数据(分数),则分数会错误地放在模板中 - 分数将放在“数学”列中而不是“拼写”列中。一旦我在数学测试中输入相同的学生姓名,它就会被纠正/移动到拼写栏中。这是一个小问题,但结果仍然放在错误的地方,我不知道为什么。
我一定是做错了。我想我错过了某种过滤。希望下面的代码有助于进一步解释它。感谢。
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]
答案 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 %}