2013-08-20 3 views
3

Я пытаюсь написать подробную страницу для каждой строки данных в таблице. Я хотел бы генерировать график matplotlib динамически для каждой страницы, используя данные из каждой строки.Использование matplotlib с Django Общие представления

Я пробовал код с нормальным видом, и он работает. Однако при использовании с страницей 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 и возврат 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 }}"/>.

+0

Не могли бы вы дать более подробную информацию о пункте 2.2? – Ger

 Смежные вопросы

  • Нет связанных вопросов^_^