3

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

4

2 回答 2

6

有两种方法可以做到这一点,具体取决于您想要做什么。

  1. 如果您只想在没有任何 HTML 的情况下显示图像,那么只需使用普通函数 view 并返回 a HttpResponse,或者如果您真的非常想使用基于类的视图覆盖该get方法并返回 a HttpResponse

  2. 如果你想显示一个嵌入了图像的 HTML 页面。然后你可以做两件事

    1. 创建一个单独的视图,该视图将仅响应您在示例中所做的图像,并在您的 HTML 页面中添加<img src="path to that view url" />.

    2. 或者,如果您不想要图像的单独视图,那么您必须在 DetailView 中创建一个图像,将其保存到字节流,对其进行 base64 编码并在您的上下文中将其返回为 (例如) image。然后在您的模板中,您使用 base64 编码数据创建一个图像标签<img src="data:image/png;base64,{{ image }}"/>

于 2013-08-23T18:35:21.927 回答
2

这里有一个很好的例子。

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

于 2014-02-20T14:00:28.470 回答