使用matplotlib和Django Generic视图

时间:2013-08-20 12:31:25

标签: django matplotlib detailview

我正在尝试为表格中的每一行数据编写详细页面。我想使用每行的数据为每个页面动态生成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图像保存到静态文件夹的情况下生成图形?

2 个答案:

答案 0 :(得分:6)

根据您的目的,有两种方法可以做到这一点。

  1. 如果你只想要一个没有任何HTML的图像,那么只需使用普通的函数视图rand返回一个HttpResponse,或者如果你真的,真的真的想要使用基于类的视图覆盖{ {1}}方法并返回get

  2. 如果要显示HTML页面,其中嵌入了图像。然后你可以做两件事

    1. 创建一个单独的视图,它将像您在示例中一样只响应图像,并在HTML页面中添加HttpResponse

    2. 或者,如果您不想为图像创建单独的视图,则必须在DetailView中创建图像,将其保存到字节流,base64对其进行编码并将其作为(例如)在您的上下文中返回<img src="path to that view url" />。然后在模板中使用image创建包含base64编码数据的图像标记。

答案 1 :(得分:2)

这里有一个很好的例子。

http://wiki.scipy.org/Cookbook/Matplotlib/Django