Django中渲染Matplotlib图表出现name 'posts'未定义错误如何解决
解决方案
1 定位posts未定义报错根源
你贴出的视图代码和result.html模板中没有直接引用posts变量,报错来自两处的概率最高:
- 你调用的
tweety.Analyzer()函数内部逻辑存在未声明就使用的posts变量,比如拉取推特数据的结果变量命名错误、漏了定义。你可以先单独调用tweety.Analyzer('测试关键词')运行,确认是否在这一步就抛出报错,是的话直接修改Analyzer函数里的变量定义即可。 - 你继承的
base.html公共模板中,用到了{{ posts }}变量但你渲染result页面时没有传递该参数。如果base里确实有相关代码,要么在render result的上下文中补充posts参数,要么把base里引用posts的部分用{% if posts %}标签包裹。
2 修复图表渲染异常问题
你当前的Matplotlib代码没有清空画布逻辑,会导致散点图和柱状图叠在一起显示异常,同时建议指定非交互式后端适配Django环境,修改后的视图代码参考如下:
from django.shortcuts import render, HttpResponse from tweetanalysis import tweety import matplotlib # 优先指定非交互式后端,避免Django环境下的渲染冲突 matplotlib.use('Agg') import matplotlib.pyplot as plt import pandas as pd import base64 from io import BytesIO def index(request): return render(request, 'index-search.html') def result(request): if request.method == 'POST': query = request.POST.get('hashtage') # 加参数非空校验,避免空参数触发Analyzer内部错误 if not query: return HttpResponse("请输入合法的查询关键词") df = tweety.Analyzer(query) # 生成散点图 plt.figure(figsize=(8, 6)) for i in range(0, df.shape[0]): plt.scatter(df.loc[i, 'Polarity'], df.loc[i, 'Subjectivity'], color='Blue') plt.title('Sentiment Analysis') plt.xlabel('Polarity') plt.ylabel('Subjectivity') buffer = BytesIO() plt.savefig(buffer, format='png') buffer.seek(0) image_png = buffer.getvalue() ans1 = base64.b64encode(image_png).decode('utf-8') buffer.close() # 清空画布,避免和下一张图叠加 plt.clf() # 生成柱状图 df['Analysis'].value_counts().plot(kind='bar') plt.title('Sentiment Analysis') plt.xlabel('Sentiment Type') plt.ylabel('Count') buffer = BytesIO() plt.savefig(buffer, format='png') buffer.seek(0) image_png = buffer.getvalue() ans2 = base64.b64encode(image_png).decode('utf-8') buffer.close() plt.close() return render(request, 'result.html', {'chart': ans1, 'plot': ans2}) else: return HttpResponse("Error!")
3 补充校验项
如果排查完前两项还有问题,检查你的index-search.html里的表单input标签的name属性是否为hashtage,如果实际写的是hashtag,会导致query取到空值,触发Analyzer内部报错。
内容的提问来源于stack exchange,提问作者Ritik Puri
相关产品推荐
相关产品推荐

