AIM
Я пытаюсь:
- Создать гистограмму,
- Храните его во временной памяти,
- Передайте изображение в шаблон.
У меня проблемы с шагом 3 выше. Я подозреваю, что делаю простую и фундаментальную ошибку при передаче данных context
в шаблон.
ERROR
HTML-рендеринг с поврежденным тегом изображения.
код
Views.py
class SearchResultsView(DetailView):
...
def get(self, request, *args, **kwargs):
self.get_histogram(request)
return super(SearchResultsView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(SearchResultsView, self).get_context_data(**kwargs)
return context
def get_histogram(self, request):
""" Function to create and save histogram of Hashtag.locations """
# create the histogram
plt.show()
img_in_memory = BytesIO()
plt.savefig(img_in_memory, format="png")
image = base64.b64encode(img_in_memory.getvalue())
context = {'image':image}
return context
Results.html
<img src="data:image/png;base64,{{image}}" alt="Location Histogram" />
РЕШЕНИЕ
В дополнение к проблемам с get
и get_context_data
, как описано @ruddra ниже, еще одна проблема заключалась в том, что мне пришлось декодировать строку base64 как строку Unicode. Для получения дополнительной информации см. здесь .
Для этого я включил: image = image.decode('utf8')
Так что views.py выглядит так:
def get_histogram(self, request):
# draw histogram
plt.show()
img_in_memory = BytesIO()
plt.savefig(img_in_memory, format="png") # save the image in memory using BytesIO
img_in_memory.seek(0) # rewind to beginning of file
image = base64.b64encode(img_in_memory.getvalue()) # load the bytes in the context as base64
image = image.decode('utf8')
return {'image':image}