Django рдореЗрдВ рд░реЗрдЦрд╛рдВрдХрди (рдЪрд╛рд░реНрдЯ) рдмрдирд╛рдПрдВ

Django-google-рдЪрд╛рд░реНрдЯ

рдХрдИ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдордп-рд╕рдордп рдкрд░ рдЖрд░реЗрдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХрд╣реВрдВрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИ)ред рдХрд╛рд░реНрдп рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрдИ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ: рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рддреНрд░, рдХреИрдирд╡рд╕, рдПрд╕рд╡реАрдЬреА, рдлреНрд▓реИрд╢, рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ ...

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ django- рдЧреВрдЧрд▓-рдЪрд╛рд░реНрдЯ рдФрд░ Google рдЪрд╛рд░реНрдЯ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ Django рдЪрд▓ рд░рд╣реА рд╕рд╛рдЗрдЯ рдкрд░ рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдЕрдХреНрд╕рд░, рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреГрд╖реНрда рдкрд░ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рддрд╛ рд╣реИ: рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

var chart_data = [ {% for row in chart_data %} [{{ row.0 }}, {{ row.1 }}], {% endfor %} ]; 

рдпрд╣ рдмреБрд░рд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдЕрднреА рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдФрд░ рдирд╣реАрдВред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдбреНрд░рд╛рдЗрдВрдЧ рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди:
  1. рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ рдкрд░ рдирдП рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
  2. рд╕рд╛рдорд╛рдиреНрдп рддрддреНрд╡реЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рдВрдЧ рдпреЛрдЬрдирд╛) рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП DRY рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рд╢рд┐рдХрд╛рдпрдд;
  3. рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  4. рдПрдХ рдирдпрд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рдХрд▓реНрдк


Django- рдЧреВрдЧрд▓-рдЪрд╛рд░реНрдЯ рдЪрд╛рд░реНрдЯрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реИрдХ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реЗрдЯ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрд▓рд╛рд░рдорд╛: рдпрд╣ рдкрд╣рд▓реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рд▓реАрдЬ рд╣реИ, рд╡рд┐рдЪрд┐рддреНрд░ рдХреАрдбрд╝реЗ рд╕рдВрднрд╡ рд╣реИрдВред рд╕реБрдзрд╛рд░ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕реНрдерд╛рдкрдирд╛

 $ pip install django-google-charts #  $ easy_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 // ... } {% endoptions %} 

рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЖрдк рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдорд░реНрдерд┐рдд рд╡рд┐рдХрд▓реНрдк рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ ред

{% 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() #   ... qsstats = QuerySetStats(queryset, date_field='datetime', aggregate=Count('id')) # ...     values = qsstats.time_series(start_date, end_date, interval='days') return render_to_response('template.html', {'values': values}) 

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):

  #         summary = qsstats.time_series(start_date, end_date, interval='days', aggregate=Sum('amount')) return render_to_response('template.html', {'values': values, 'summary': summary}) 

- 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 #    sqlite  /tmp $ python manage.py populatedb #     $ python manage.py runserver 

рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

Django-google-рдЪрд╛рд░реНрдЯ

рдкрд╣рд▓реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рд▓реАрдЬ рдХреА рд╕реАрдорд╛рдПрдВ (рдорд░рд╣рдо рдореЗрдВ рдЙрдбрд╝рдирд╛)

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

Source: https://habr.com/ru/post/In126704/


All Articles