1

django で matplotlib の棒グラフを作成しようとしています。使用されるデータは、データベースから照会されます。

コードを実行すると、次のエラーが発生しました。

割り当て前に参照される /graph.png ローカル変数 'topic' の UnboundLocalError

以前に静的データを実行しようとしたときに、matplotlib 部分のコードはすべて正しく動作しました。ただし、データベースからデータをクエリしようとすると、views.py でこのエラーが発生します。私はこのクエリを何度も別のページで実行し、正常に動作しています。しかし、この要求では機能しません。なんで?

def bar_chart(request):
    #Topic Distribution
    topics = list(topic.objects.filter(subject_id=subj_id).order_by('id').values())

    fig = Figure()
    ax = fig.add_subplot(111)

    N = 5
    ind = np.arange(N)
    width = 0.35

    group_labels = [] #list of x-axis tick labels
    y = [] #list of y-values
    total_marks = 0 #total marks
    for topic in topics:
        t_questions = question.objects.filter(topic_id=topic.id)
        if (len(t_questions) != 0):
            topic_marks = 0 #each topic starts at 0 marks distribution
            for t_question in topic_questions:
                topic_marks += t_question.marks #accumulate the marks
            total_marks += topic_marks
            y.append(topic_marks)
            group_labels.append(topic.title)
    for yval in y:
        yval = yval/total_marks * 100 #convert to percentage


    ax.bar(ind, y, width, color='r')
    ax.set_ylabel('Distribution in %')
    ax.set_title('Topic Distribution')
    ax.set_xticks(ind)
    ax.set_xticklabels(group_labels)
    fig.autofmt_xdate()
    canvas=FigureCanvas(fig)
    response=HttpResponse(content_type='image/png')
    canvas.print_png(response)

    return response
4

1 に答える 1

3

エラーは次のとおりです。

topics = list(topic.objects.filter(subject_id=subj_id).order_by('id').values())

モデルの一般的な命名規則に従っている場合、あなたのモデルはおそらくトピックと呼ばれるので、

topics = list(Topic.objects.filter(subject_id=subj_id).order_by('id').values())

そうしないと、インポートが欠落している可能性があります。

これは、関数内で定義されたローカル変数トピックが原因であり、グローバル トピックを覆い隠しています。

于 2012-12-17T12:39:55.363 に答える