2013-08-20 78 views
3

我想爲表中的每一行數據寫一個詳細頁面。我想使用每行的數據爲每個頁面動態生成一個matplotlib圖形。在Django中使用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圖像保存到靜態文件夾的情況下生成圖形?

回答

5

有兩種方法可以做到這一點,這取決於你想做什麼。

  1. 如果你只是想要一個圖像顯示沒有任何HTML,那麼就使用普通功能觀蘭特返回HttpResponse或者如果你真的,真的真的想使用基於類的意見重寫get方法和返回一個HttpResponse

  2. 如果你想顯示一個HTML頁面,其中嵌入了圖像。然後,你可以做兩件事情

    1. 創建一個獨立的視圖,你在你的例子一樣,將只圖像作出反應,並在HTML頁面中只需添加<img src="path to that view url" />

    2. 或者,如果您不想爲圖像單獨顯示視圖,則必須在DetailView中創建圖像,將其保存爲字節流,base64對其進行編碼並將其作爲(例如)image 。然後在您的模板中,使用<img src="data:image/png;base64,{{ image }}"/>創建帶有base64編碼數據的圖像標籤。

+0

您能否給出關於2.2的更多細節? – Ger