3 votes

Utilisation de matplotlib avec les vues génériques de Django

J'essaie d'écrire une page détaillée pour chaque ligne de données du tableau. Je voudrais générer un graphique matplotlib dynamiquement pour chaque page en utilisant les données de chaque ligne.

J'ai essayé le code avec une vue normale et cela fonctionne. Cependant, lorsqu'il est utilisé avec la vue detail_view l'image apparaît comme un lien brisé. Que dois-je inclure dans le DetailView pour générer le graphique pour chaque page ?

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

Comment lier le graphique au modèle, de préférence sans balises statiques ou médias ? Est-il possible de générer les graphiques sans enregistrer les images PNG dans le dossier statique ?

6voto

Viktor Kerkez Points 11222

Il existe deux façons de procéder, en fonction de ce que vous voulez faire.

  1. Si vous voulez simplement afficher une image sans HTML, utilisez une fonction normale view rand return a HttpResponse ou si vous voulez vraiment, vraiment, vraiment utiliser des vues basées sur des classes, remplacez l'option get et retourner un HttpResponse .

  2. Si vous voulez afficher une page HTML avec l'image incorporée quelque part dans celle-ci. Alors vous pouvez faire deux choses

    1. Créez une vue séparée qui répondra avec juste l'image comme vous l'avez fait dans votre exemple, et dans votre page HTML ajoutez simplement <img src="path to that view url" /> .

    2. Ou si vous ne voulez pas d'une vue séparée pour l'image, vous devez créer une image dans la DetailView, la sauvegarder dans un flux d'octets, la coder en base64 et la renvoyer dans votre contexte comme (par exemple) image . Ensuite, dans votre modèle, vous créez une balise image avec les données encodées en base64 en utilisant <img src="data:image/png;base64,{{ image }}"/> .

2voto

wobbily_col Points 648

Il existe un bel exemple ici.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X