#python #django #graph #django-templates #matplotlib
#python #django #График #django-шаблоны #matplotlib
Вопрос:
Учитывая этот пример, взятый из здесь:
def simple(request):
import random
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.dates import DateFormatter
fig=Figure()
ax=fig.add_subplot(111)
x=[]
y=[]
now=datetime.datetime.now()
delta=datetime.timedelta(days=1)
for i in range(10):
x.append(now)
now =delta
y.append(random.randint(0, 1000))
ax.plot_date(x, y, '-')
ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
fig.autofmt_xdate()
canvas=FigureCanvas(fig)
response=django.http.HttpResponse(content_type='image/png')
canvas.print_png(response)
return response
Как я могу написать представление таким образом, чтобы использовать шаблон и переменную типа:
return render_to_response ('template.html',{'graph': <graph generated by matplotlib> }
Ответ №1:
Когда у меня была похожая ситуация, я использовал два представления. Один использовал matplotilb для генерации PNG, в то время как другой использовал шаблоны django для создания HTML-страницы, которая представляла PNG (и некоторые другие данные). Параметром, отправленным в шаблон, было просто имя файла PNG. Затем другой вид прикрепляется к соответствующим URL-адресам в формате png.
Одна из проблем заключается в том, что вы хотите вычислить некоторые параметры, которые используются как для генерации HTML, так и PNG. Я закодировал такую информацию в имени файла. Это болезненно и немного халтурно, но для пользователя также полезно, если вся информация содержится в имени файла, когда он его сохраняет.
Комментарии:
1. Я не предполагаю, что вы знаете о другой библиотеке / пакете, который будет это делать? Действительно хотите избежать написания 2 представлений для каждого типа графика.
2. Итак, вам приходилось записывать каждый график в таблицу и вызывать его снова?
3. Я думал, что иметь два представления было естественным, поскольку задействованы два URL-адреса. Один для PNG-файла и один для HTML-страницы-оболочки. Возможно, вы хотите отображать только PNG-файл без страницы переноса, но в этом случае я вообще не понимаю, как в него попадают шаблоны django.