0

学生のテスト結果テンプレートを作成していますが、問題があります。現在、テストモデルで2つのテスト(数学とスペル)を作成しました。問題は、最初に生徒の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]
4

1 に答える 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 %}
于 2012-09-26T08:28:40.283 に答える