我正在尝试为表格中的每一行数据编写详细页面。我想使用每行的数据为每个页面动态生成matplotlib图。
我已经尝试了普通视图的代码并且它可以工作。但是,与detail_view
页面一起使用时,图像显示为断开的链接。我应该在DetailView
类中包含哪些内容来为每个页面生成图表?
graph.py
:
def plotResults(request):
p=get_object_or_404(Read_alignment,pk=id)
x =[]
y=[]
x.append(p.start)
x.append(p.stop)
y.append(p.count)
y.append(p.count)
fig=plt.figure()
ax= fig.add_subplot(311)
ax.set_xlim(right=30)
ax.step(x,y,'-',where='post', label='post')
canvas = FigureCanvas(fig)
response= HttpResponse(mimetype='image/png')
canvas.print_png(response)
return response
url.py
:
url(r'^(?P<pk>\d+)/align/plotResults.png$',plotResults),
url(r'^(?P<pk>\d+)/align/$',AlignDetailView.as_view(), name='AlignDetailView'),
views.py
:
class AlignDetailView(DetailView):
model = Read_alignment
def get_queryset(self):
queryset= Read_alignment.objects.filter(chr__icontains=3l)
return queryset
def get_context_data(self, **kwargs):
context = super(AlignDetailView,self).get_context_data(**kwargs)
context['alignment'] = self.object
return context
如果没有静态或媒体标签,我应该如何将图表链接到模板?是否可以在不将PNG图像保存到静态文件夹的情况下生成图形?
答案 0 :(得分:6)
根据您的目的,有两种方法可以做到这一点。
如果你只想要一个没有任何HTML的图像,那么只需使用普通的函数视图rand返回一个HttpResponse
,或者如果你真的,真的真的想要使用基于类的视图覆盖{ {1}}方法并返回get
。
如果要显示HTML页面,其中嵌入了图像。然后你可以做两件事
创建一个单独的视图,它将像您在示例中一样只响应图像,并在HTML页面中添加HttpResponse
。
或者,如果您不想为图像创建单独的视图,则必须在DetailView中创建图像,将其保存到字节流,base64对其进行编码并将其作为(例如)在您的上下文中返回<img src="path to that view url" />
。然后在模板中使用image
创建包含base64编码数据的图像标记。
答案 1 :(得分:2)
这里有一个很好的例子。