学生テスト結果テンプレートを作成していますが問題があります。現在、テストモデルで2つのテスト(数学とスペル)を作成しています。問題は、最初に生徒の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]
回答:
回答№1は0問題は何とか注文する必要があるということです item.art.all()
あなたのテーブルの列と同じ順序で(つまり、 数学の数字とその後のスペル)。また、テスト結果の1つだけが追加された場合も処理する必要があります。 しかし、これを達成するための真っ直ぐな方法はありません。あなたは外国のキー(または関係)メンバーを持つことができません。 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 %}