рдХрдИ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдордп-рд╕рдордп рдкрд░ рдЖрд░реЗрдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХрд╣реВрдВрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИ)ред рдХрд╛рд░реНрдп рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрдИ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ: рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рддреНрд░, рдХреИрдирд╡рд╕, рдПрд╕рд╡реАрдЬреА, рдлреНрд▓реИрд╢, рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ ...
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ
django- рдЧреВрдЧрд▓-рдЪрд╛рд░реНрдЯ рдФрд░
Google рдЪрд╛рд░реНрдЯ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ Django рдЪрд▓ рд░рд╣реА рд╕рд╛рдЗрдЯ рдкрд░ рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдЕрдХреНрд╕рд░, рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреГрд╖реНрда рдкрд░ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рддрд╛ рд╣реИ: рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
var chart_data = [ {% for row in chart_data %} [{{ row.0 }}, {{ row.1 }}], {% endfor %} ];
рдпрд╣ рдмреБрд░рд╛ рдХреНрдпреЛрдВ рд╣реИ?
- рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреА? :)
- рдЗрд╕реЗ рдкреИрдорд╛рдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдЬрдм рдЖрдкрдХреЛ рдкреГрд╖реНрда рдкрд░ рджреВрд╕рд░рд╛ рдЧреНрд░рд╛рдлрд╝ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рдЯреБрдХрдбрд╝реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд░ рдирд╛рдореЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЕрдкрдардиреАрдп рдЧрдбрд╝рдмрдбрд╝ рд╣реИ, рдЗрд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЕрдкреНрд░рд┐рдп рд╣реИред
- рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдмрд╛рдзреНрдпрдХрд╛рд░реАред рдРрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рд╕реАрдорд┐рдд рд╣реИред
рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдЕрднреА рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдФрд░ рдирд╣реАрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдбреНрд░рд╛рдЗрдВрдЧ рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди:
- рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ рдкрд░ рдирдП рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
- рд╕рд╛рдорд╛рдиреНрдп рддрддреНрд╡реЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рдВрдЧ рдпреЛрдЬрдирд╛) рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП DRY рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рд╢рд┐рдХрд╛рдпрдд;
- рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
- рдПрдХ рдирдпрд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рдХрд▓реНрдк
Django- рдЧреВрдЧрд▓-рдЪрд╛рд░реНрдЯ рдЪрд╛рд░реНрдЯрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реИрдХ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реЗрдЯ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрд▓рд╛рд░рдорд╛: рдпрд╣ рдкрд╣рд▓реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рд▓реАрдЬ рд╣реИ, рд╡рд┐рдЪрд┐рддреНрд░ рдХреАрдбрд╝реЗ рд╕рдВрднрд╡ рд╣реИрдВред рд╕реБрдзрд╛рд░ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рд╕реНрдерд╛рдкрдирд╛
$ pip install django-google-charts
INSTALLED_APPS
'googlecharts'
рдЬреЛрдбрд╝реЗрдВред
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп)
{% load googlecharts %} {% googlecharts %} {% data " " %} {# () #} {% col "" "" %}...{% endcol %} {# #} {% col "" "" %}...{% endcol %} {# #} ... {% enddata %} {% options " " %} {# () #} ... {% endoptions %} {% graph "#id" "" "" %} {# #} {% endgooglecharts %}
рдореИрдВ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрддрд╛рдКрдВрдЧрд╛ред
{% googlecharts %}...{% endgooglecharts %}
рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд╕рдВрдкреВрд░реНрдг рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИред рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред
{% data "" %}...{% enddata %}
рдПрдХ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯред рдЖрдк рдирд╛рдо рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (
"default"
рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)ред
{% col "" "" %}...{% endcol %}
рд╕реНрд╡рд░реВрдкред Google рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди API рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
'string' 'number' 'boolean' 'date' 'datetime' 'timeofday'
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВред
рд╡рд┐рд╢реЗрд╖ рд╡реИрд░рд┐рдПрдмрд▓
val
рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдЧреБрдЬрд░рд╛ рд╣реИ, рдЗрд╕ рдЬрдЧрд╣ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{% col "string" "Date" %}'{{ val|date:"M j" }}'{% endcol %} {# , #} {% col "number" %}{{ val|floatformat:2 }}{% endcol %}
рдкрд░рд┐рдгрд╛рдо рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЦреБрдж рдХреЛ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдордиреЗ
{% data %}
рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕рдВрджрд░реНрдн рдЪрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ:
[['foo', 32], ['bar', 64], ['baz', 96]]
рдЗрдирдкреБрдЯ рд▓рд╛рдЗрди рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдореЗрдВ рджреЛ рдЯреИрдЧ
{% col %}
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЗрдирдкреБрдЯ 'рдлреВ', 'рдмрд╛рд░' рдФрд░ 'рдмрд╛рдЬ' рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛; рджреВрд╕рд░рд╛, рдХреНрд░рдорд╢рдГ, 32, 64 рдФрд░ 96ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд╕рдмрд╕реЗ рд╕рд░рд▓) рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ:
{% col "string" "Name" %}"{{ val }}"{% endcol %} {% col "number" "Value" %}{{ val }}{% endcol %}
{% options "" %}...{% endoptions %}
рдЪрд╛рд░реНрдЯ рд╡рд┐рдХрд▓реНрдкред
{% options %} kind: "LineChart", options: { width: 300, height: 240
рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЖрдк рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдорд░реНрдерд┐рдд рд╡рд┐рдХрд▓реНрдк
рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз
рд╣реИрдВ ред
{% graph "id_" "" "" %}
рд╣рдо рдкреГрд╖реНрда рдкрд░ рдПрдХ рддрддреНрд╡ рдореЗрдВ рдЧреНрд░рд╛рдл рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо
"default" "default"
ред
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореЙрдбрд▓ рд╣реИ:
class Payment(models.Model): amount = models.DecimalField(max_digits=11, decimal_places=4) datetime = models.DateTimeField()
рдЖрдк рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
django-qsstats-Magic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
from qsstats import QuerySetStats def view_func(request): start_date = ... end_date = ... queryset = Payment.objects.all()
time_series
рдкрджреНрдзрддрд┐ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддреА рд╣реИ:
[[date, value], [date, value], ...]
Template.html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ:
{% load googlecharts %} <div id="count_graph"></div> {% googlecharts %} {% data values "count" %} {% col "string" "Date" %}"{{ val|date:"M j" }}"{% endcol %} {% col "number" "# of payments" %}{{ val }}{% endcol %} {% enddata %} {% options %} kind: "LineChart", options: { backgroundColor: "#f9f9f9", colors: ["#09f"], gridlineColor: "#ddd", legend: "none", vAxis: {minValue: 0}, chartArea: {left: 40, top: 20, width: 240, height: 180}, width: 300, height: 240 } {% endoptions %} {% graph "count_graph" "count" %} {# #} {% endgooglecharts %}
рд╕реНрдХреЗрд▓рд┐рдВрдЧ
рдЕрдм, рдкреЗрдЬ рдореЗрдВ рдПрдХ рдФрд░ рдЧреНрд░рд╛рдл рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:
- рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░реЗрдВ (view.py):
- template.html рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
<div id="count_sum"></div> ... {% data summary "sum" %} {% col "string" "Date" %}"{{ val|date:"M j" }}"{% endcol %} {% col "number" "Paid amount, USD" %}{{ val|floatformat:2 }}{% endcol %} {% enddata %} ... {% graph "count_sum" "sum" %} {# , #}
GitHub
Django- рдЧреВрдЧрд▓-рдЪрд╛рд░реНрдЯ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдПрдХ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рднреА рд╣реИред рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:
$ python manage.py syncdb --noinput
рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

рдкрд╣рд▓реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рд▓реАрдЬ рдХреА рд╕реАрдорд╛рдПрдВ (рдорд░рд╣рдо рдореЗрдВ рдЙрдбрд╝рдирд╛)
- рдкреНрд░рддрд┐ рдкреГрд╖реНрда рдХреЗрд╡рд▓ рдПрдХ рдЯреИрдЧ
{% googlecharts %}
; - (рд▓рдЧрднрдЧ) рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ;
- рд▓реБрдкреНрддрдкреНрд░рд╛рдп рджрд╕реНрддрд╛рд╡реЗрдЬред
рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред
рдЖрдк рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ?