過去のデータを古いもの順に5件まで表示させたいです。過去のテストの受験日とスコアを表示させるプログラムを書いています。views.pyに
@login_required def past_result(request): return render(request, 'past_result.html', {'chart': _view_plot(request)}) def _view_plot(request): results = TestAndUser.objects.filter(user=request.user).order_by('-date') scores = [1, 2, 3, 4, 5] dates = [results[4].date, results[3].date, results[2].date, results[1].date, results[0].date] heights = [results[4].score,results[3].score,results[2].score, results[1].score,results[0].score] image_data =[] for i in range(len(scores)): if scores[i] != None : image_data.append(scores[i]) image_data.append(dates[i]) image_data.append(heights[i]) image_scores =[] image_dates = [] image_heights = [] for j in range(0,len(image_data),3): image_scores.append(image_data[j]) image_dates.append(image_data[j+1]) image_heights.append(image_data[j+2]) plt.plot(image_scores, image_heights) plt.xticks(image_scores, image_dates) plt.fill_between(x=np.arange(1, 5, 0.01), y1=60, y2=100, facecolor='yellow', alpha=0.2) jpg_image_buffer = cStringIO.StringIO() plt.savefig(jpg_image_buffer) array = base64.b64encode(jpg_image_buffer.getvalue()) jpg_image_buffer.close() return array
とコードを書きました。
models.pyには
class TestAndUser(models.Model): dates = models.ImageField(upload_to='images', null=True, blank=True,) score = models.IntegerField(max_length=100,null=True)
とコードを書きました。
最終的には過去のテストの受験日とスコアを画像として表示させたいです。しかし、今のコードでは5つデータが入っているならエラーは出ないのですが、4つなど5つ未満の場合list index out of range とエラーが出ます。エラーが出る原因はわかっていて、results[4]などがないからだと思っています。
models.pyのdatesには20170809(2017年8月9日の意味)や20161203などが入っていて
results = TestAndUser.objects.filter(user=request.user).order_by('-date')
で、これを最新順に並べています。例えば、3件しかデータがない時
dates = [results[4].date, results[3].date, results[2].date, results[1].date, results[0].date] heights = [results[4].score,results[3].score,results[2].score, results[1].score,results[0].score]
の部分には3つずつ古いもの順にデータが入るようにしたいです。どのようにコードを書けば期待通りのプログラムが作れますか?
現在コードは
@login_required def past_result(request): return render(request, 'past_result.html', {'chart': _view_plot(request)}) def _view_plot(request): results = TestAndUser.objects.filter(user=request.user).order_by('-date') print(results) dates = [r.consultation_date for r in reversed(tcresults)] heights = [r.tc for r in reversed(tcresults)] scores = [i + 1 for i in range(len(heights))] if len(scores) > 5: dates = dates[:5] heights = heights[:5] scores = scores[:5] image_data =[] for i in range(len(scores)): if scores[i] != None : image_data.append(scores[i]) image_data.append(dates[i]) image_data.append(heights[i]) image_scores =[] image_dates = [] image_heights = [] for j in range(0,len(image_data),3): image_scores.append(image_data[j]) image_dates.append(image_data[j+1]) image_heights.append(image_data[j+2]) plt.plot(image_scores, image_heights) plt.xticks(image_scores, image_dates) plt.fill_between(x=np.arange(1, 5, 0.01), y1=60, y2=100, facecolor='yellow', alpha=0.2) jpg_image_buffer = cStringIO.StringIO() plt.savefig(jpg_image_buffer) array = base64.b64encode(jpg_image_buffer.getvalue()) jpg_image_buffer.close() return array
と書きました。
print(results)ではdateの新しいもの順に<QuerySet [<TestAndUser: xxx 59>, <TestAndUser: xxx 58>, <TestAndUser: xxx 54>, <TestAndUser: xxx 52>, <TestAndUser: xxx 50>, <TestAndUser: kadena xxx>]> と表示されました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/04 08:55
2017/11/04 09:00
退会済みユーザー
2017/11/04 09:13 編集
2017/11/04 10:16
退会済みユーザー
2017/11/04 14:23
退会済みユーザー
2017/11/04 14:28
退会済みユーザー
2017/11/04 14:29
2017/11/04 14:29
2017/11/04 14:31
2017/11/04 14:36
退会済みユーザー
2017/11/04 14:52
退会済みユーザー
2017/11/04 14:52
退会済みユーザー
2017/11/04 14:54
2017/11/04 15:20
2017/11/04 15:22
2017/11/04 15:24
退会済みユーザー
2017/11/05 01:17
2017/11/05 03:39