{"id":275629,"date":"2016-03-08T00:41:49","date_gmt":"2016-03-07T21:41:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=275629"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=275629","title":{"rendered":"django-controlcenter"},"content":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/111\/ba0\/3a0\/111ba03a0ef340589937512b6292bd1c.png\" alt=\"django-controlcenter\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0435\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u2014 <a href=\"https:\/\/github.com\/byashimov\/django-controlcenter\">django-controlcenter<\/a>. \u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0448\u0431\u043e\u0443\u0440\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e django-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0426\u0435\u043b\u044c<\/h2>\n<p>  <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/contrib\/admin\/\">Django-admin<\/a> \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Create,_read,_update_and_delete\">CRUD<\/a> \u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0432 \u0431\u0430\u0437\u0435. \u041f\u043e\u0442\u043e\u043c \u0432\u043d\u043e\u0441\u0438\u0442\u0435 \u0432\u0442\u043e\u0440\u0443\u044e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0442\u0440\u0435\u0442\u044c\u044e \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0443 \u0432\u0430\u0441 \u043d\u0430\u0431\u0435\u0433\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0442\u0430\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0447\u0435\u043a: \u0441 \u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043e\u0442\u0437\u044b\u0432\u0430\u043c\u0438 \u2014 \u0438 \u0432\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u0431\u0435\u0433\u0430\u0442\u044c \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043d\u0438\u043c\u0438 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430 \u0434\u043d\u044e. \u0410 \u0435\u0449\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432.<\/p>\n<p>  <a href=\"https:\/\/github.com\/byashimov\/django-controlcenter\">Django-controlcenter<\/a> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0437-\u0437\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445, \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c, \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c, \u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u0432 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445.<\/p>\n<h3>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h3>\n<p>  \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 ajax, \u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Create,_read,_update_and_delete\">CRUD<\/a>, \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e <em>Read<\/em>, \u043d\u043e \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<h2>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<pre><code class=\"python\"># project\/dashboard.py  from controlcenter import Dashboard, widgets from project.app.models import Model  class ModelItemList(widgets.ItemList):     model = Model     list_display = ['pk', 'field']  class MyDashboard(Dashboard):     widgets = (         ModelItemList,     )  # project\/settings.py CONTROLCENTER_DASHBOARDS = [     'project.dashboards.MyDashboard' ]<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u0432\u0438\u0434\u0436\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0432 \u0434\u0432\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044f\u044e <code>ItemList<\/code> \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0432 \u0432\u044b\u0434\u0430\u0447\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0440\u0432\u0430\u0442\u044c \u0432\u0430\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/eb8\/0de\/c2f\/eb80dec2fa324f3bb807471a2d5ad03d.png\" alt=\"itemlist\"\/><\/p>\n<p>  \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b; \u0432 \u0446\u0435\u043b\u043e\u043c, \u0432\u0438\u0434\u0436\u0435\u0442 \u2014 \u044d\u0442\u043e \u0441\u043c\u0435\u0441\u044c <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/topics\/http\/views\/\">Views<\/a> \u0438 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/contrib\/admin\/#modeladmin-objects\">ModelAdmin<\/a> \u0432 \u043f\u043b\u0430\u043d\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0438 \u0438\u0445 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"python\">class ModelItemList(widgets.ItemList):     model = Model     queryset = model.active_objects.all()     list_display = ('pk', 'field', 'get_foo')     list_display_links = ('field', 'get_foo')     template_name = 'my_custom_template.html'      def get_foo(self, obj):         return 'foo'     get_foo.allow_tags = True     get_foo.short_description = 'Foo!'<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e. <em>\u041f\u043e\u043a\u0430 \u0435\u0449\u0435<\/em>.<\/p>\n<h2>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h2>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u043e \u0441\u0443\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043a \u043d\u0438\u043c.<\/p>\n<h2>\u0412\u0438\u0434\u0436\u0435\u0442\u044b<\/h2>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0438: <code>Widget<\/code>, <code>ItemList<\/code> \u0438 <code>Chart<\/code>. \u0415\u0449\u0435 \u0435\u0441\u0442\u044c <code>Group<\/code>, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0438\u0434\u0436\u0435\u0442, \u0430 \u043e\u0431\u0435\u0440\u0442\u043a\u0430. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u0435\u0433\u043e. <\/p>\n<h3>Group<\/h3>\n<p>  \u0412\u0438\u0434\u0436\u0435\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u044b, \u0442\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u0443. \u0414\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c\/\u043a\u0430\u0440\u0442\u0435\u0436\u043e\u043c \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u2014 <code>Group<\/code>.<\/p>\n<pre><code class=\"python\">class MyDashboard(Dashboard):     widgets = (         Foo,         (Bar, Baz),         Group((Egg, Spam), width=widgets.LARGE, height=300,               attrs={'class': 'my_class', 'data-foo': 'foo'}),     )<\/code><\/pre>\n<p>  <code>Group<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: <code>width<\/code>, <code>height<\/code>, <code>attrs<\/code>.<br \/>  \u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0442\u0430\u043a\u043e\u0439 &quot;\u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439&quot; \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0433\u043e &quot;\u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e&quot; \u0432 \u0433\u0440\u0443\u043f\u043f\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u0434\u0438\u0437\u0430\u0439\u043d \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"http:\/\/masonry.desandro.com\/\">Masonry<\/a> \u2014 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0430\u0431\u0430\u0440\u0438\u0442\u044b \u0431\u043b\u043e\u043a\u0430, \u0435\u0441\u0442\u044c \u0448\u0430\u043d\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044f\u0441\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0441\u044c \u0434\u0435\u0448\u0431\u043e\u0430\u0440\u0430\u0434.<\/p>\n<h4>Group.width<\/h4>\n<p>  \u0421\u0435\u0442\u043a\u0430 \u0434\u0435\u0448\u0431\u043e\u0430\u0440\u0434\u0430 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u0430: \u0434\u043e <code>768px<\/code> \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0432\u0441\u044e \u0448\u0438\u0440\u0438\u043d\u0443, \u0437\u0430\u0442\u0435\u043c <code>50%<\/code> \u0438\u043b\u0438 <code>100%<\/code>. \u041e\u0442 <code>1000px<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f 6-\u043a\u043e\u043b\u043e\u043d\u043d\u0430\u044f \u0441\u0435\u0442\u043a\u0430. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 <code>widgets<\/code>:<\/p>\n<pre><code class=\"python\"># controlcenter\/widgets.py MEDIUM = 2   # 33%  \u0438\u043b\u0438  [x] + [x] + [x] LARGE = 3    # 50%  \u0438\u043b\u0438  [  x ] + [ x  ] LARGER = 4   # 66%  \u0438\u043b\u0438  [    x  ] + [x] LARGEST = 6  # 100% \u0438\u043b\u0438  [      x      ]<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442.<\/p>\n<h4>Group.height<\/h4>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e <code>None<\/code>, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0438\u043d\u0442\u0435\u0434\u0436\u0435\u0440, \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u0438\u0434\u0436\u0435\u0442\u0443 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a <code>max-height<\/code> \u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b.<br \/>  <code>width<\/code> \u0438 <code>height<\/code> \u0435\u0441\u0442\u044c \u0438 \u0443 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>Group<\/code>, \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435.<\/p>\n<h4>Group.attrs<\/h4>\n<p>  \u0412\u0441\u0435, \u0447\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0436\u0435\u0442 \u043a\u0430\u043a <code>html<\/code> \u0430\u0442\u0440\u0438\u0431\u0443\u0442. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0437\u0430\u0434\u0430\u0442\u044c <code>id<\/code>.<\/p>\n<h3>Widget<\/h3>\n<p>  \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043c\u0435\u0435\u0442. \u041d\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c\u044e: \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>values<\/code> (\u0438 <code>series<\/code>, <code>labels<\/code>, <code>legend<\/code> \u0434\u043b\u044f \u0447\u0430\u0440\u0442\u043e\u0432) \u0432 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/utils\/#django.utils.functional.cached_property\">cached_property<\/a>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043a\u0430\u043a \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044e \u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443 (\u0431\u0435\u0437 \u0432\u044b\u0437\u043e\u0432\u0430), \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0447\u0430\u0440\u0442\u043e\u0432 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u0430:<\/p>\n<pre><code class=\"python\">def labels(self):     return [x for x, y in self.values]  def series(self):     return [y for x, y in self.values]  def values(self):     return self.get_queryset().values_list('label', 'series')<\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u0441 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0440\u0430\u0437 \u044d\u0442\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h4>Widget.title<\/h4>\n<p>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432\u0438\u0434\u0436\u0435\u0442\u0430. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h4>Widget.width \u0438 Widget.height<\/h4>\n<p>  \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 <code>Group<\/code> (\u0441\u043c. \u0432\u044b\u0448\u0435).<\/p>\n<h4>Widget.model<\/h4>\n<p>  \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/topics\/db\/models\/\">django.db.models.Model<\/a>.<\/p>\n<h4>Widget.get_queryset<\/h4>\n<p>  \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0430\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0443 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/topics\/http\/views\/\">django.generic.views<\/a>:<\/p>\n<ul>\n<li>\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c <code>queryset<\/code>, \u0432\u0435\u0440\u043d\u0435\u0442 \u0435\u0433\u043e.<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c <code>model<\/code>, \u0432\u0435\u0440\u043d\u0435\u0442 \u0435\u0433\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4>Widget.values \u0438 Widget.limit_to<\/h4>\n<p>  \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>get_queryset<\/code>.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0435 &quot;\u0433\u0434\u0435-\u0442\u043e \u0442\u0430\u043c&quot;, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e <code>get_queryset<\/code>. \u0425\u043e\u0442\u044c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0447\u0438\u0442\u0430\u0439\u0442\u0435. \u0422\u0430\u043a\u0436\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0432\u0435\u0440\u0438\u0441\u0435\u0442 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e <code>limit_to<\/code>, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043d\u0435 \u0440\u0430\u0432\u043d\u043e <code>None<\/code>, \u0432\u043e\u0442 \u0442\u0430\u043a: <code>self.get_queryset()[:self.limit_to]<\/code>.<\/p>\n<h4>Widget.template_name_prefix<\/h4>\n<p>  \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u0430\u043c\u0438.<\/p>\n<h4>Widget.template_name<\/h4>\n<p>  \u0418\u043c\u044f \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u0430.<\/p>\n<h4>Widget.get_template_name<\/h4>\n<p>  \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Widget.template_name_prefix<\/code> + <code>Widget.template_name<\/code>.<\/p>\n<h3>ItemList<\/h3>\n<p>  \u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041f\u0440\u043e\u0441\u0442\u043e\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0436\u0443\u0435\u0442 \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u043f\u043e\u0434\u044f: \u043c\u043e\u0434\u0435\u043b\u0438, \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u043b\u0438\u0441\u0442\u044b, <a href=\"https:\/\/docs.python.org\/2\/library\/collections.html#collections.namedtuple\">namedtuple<\/a> \u2014 \u0432\u0441\u0435, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e \u043a\u043b\u044e\u0447\u0443\/\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"python\">class ModelItemList(widgets.ItemList):     model = Model     queryset = model.objects.all()     list_display = ['pk', 'field']<\/code><\/pre>\n<p>  <\/p>\n<h4>ItemList.list_display<\/h4>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 <code>values<\/code> \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043f\u043e \u043a\u043b\u044e\u0447\u0430\u043c \u0438\u0437 <code>list_display<\/code> (\u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u0438 namedtuple), \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043b\u044e\u0447\u0430 \u0440\u0430\u0432\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0433\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f <code>zip(list_display, values)<\/code>.<\/p>\n<h5>\u041d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a<\/h5>\n<p>  \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 <code>#<\/code> \u0432 <code>list_display<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a. \u0422\u0430\u043a\u0436\u0435 &quot;\u0440\u0435\u0448\u0435\u0442\u043a\u0443&quot; \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u0435\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <code>settings.CONTROLCENTER_SHARP<\/code>.<\/p>\n<h4>ItemList.list_display_links<\/h4>\n<p>  \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/contrib\/admin\/#django.contrib.admin.ModelAdmin.list_display_links\">list_display_links<\/a> \u0432 django.<\/p>\n<h4>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/h4>\n<p>  <code>ItemList<\/code> \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0438\u0434\u0436\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0437\u0434\u0435: \u0435\u0441\u043b\u0438 <code>values<\/code> \u0432\u0435\u0440\u043d\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u043e \u0432\u044b\u0442\u044f\u043d\u0435\u0442 \u0432\u0441\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e. \u0415\u0441\u043b\u0438 <code>values<\/code> \u0432\u0435\u0440\u043d\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 <a href=\"https:\/\/docs.python.org\/2\/library\/collections.html#collections.namedtuple\">namedtuple<\/a>, \u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>ItemList.model<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e, \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0442\u043a\u0443\u0434\u0430. \u0412\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 <code>pk<\/code> \u0438\u043b\u0438 <code>id<\/code> \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0438\u0434\u0436\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u043b\u044e\u0447\u0438 \u0432 <code>list_display<\/code> \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<br \/>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 <code>deferred<\/code> \u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a: <code>queryset = Model.obejcts.defer('field')<\/code>.<br \/>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0439 \u0444\u0438\u0447\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/contrib\/admin\/\">django-admin<\/a>.<\/p>\n<h4>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 changelist \u043c\u043e\u0434\u0435\u043b\u0438<\/h4>\n<p>  \u0418\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043c\u043e\u0434\u0435\u043b\u0438. <code>ModelAdmin<\/code> \u0441\u0442\u0440\u043e\u0438\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u0443\u0442\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0432 \u0432\u0438\u0434\u0436\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0432 <code>queryset<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u043e\u0447\u044c. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e:<\/p>\n<pre><code class=\"python\">class ModelItemList(widgets.ItemList):     model = Model     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c     changelist_url = model      # \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439     changelist_url = model, {'status__exact': 0, 'o': '-7.-1'}      # \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439     changelist_url = model, 'status__exact=0&amp;o=-7.-1'      # \u0418\u043b\u0438 \u0442\u0430\u043a     changelist_url = '\/admin\/model\/'     changelist_url = 'http:\/\/www.yandex.ru'<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0439 \u0444\u0438\u0447\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/contrib\/admin\/\">django-admin<\/a>.<\/p>\n<h4>ItemList.sortable<\/h4>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>sortable=True<\/code>, \u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0434\u0436\u0430\u043d\u0433\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0432 \u0431\u0430\u0437\u0435, \u0430 \u0432\u0438\u0434\u0436\u0435\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0433\u0443\u0442 \u0441\u043b\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0437\u0443\u0441\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0434\u0430\u0442\u044b \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>dd.mm<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"http:\/\/github.hubspot.com\/sortable\/docs\/welcome\/\">sortable.js<\/a>.<\/p>\n<h4>ItemList.method.allow_tags \u0438 ItemList.method.short_description<\/h4>\n<p>  \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0434\u0436\u0430\u043d\u0433\u043e\u0432\u0441\u043a\u0438\u043c <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/contrib\/admin\/#django.contrib.admin.ModelAdmin.list_display\">allow_tags<\/a> \u0438 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/ref\/contrib\/admin\/#django.contrib.admin.ModelAdmin.list_display\">short_description<\/a>.<\/p>\n<h4>ItemList.empty_message<\/h4>\n<p>  \u0412\u044b\u0432\u0435\u0434\u0435\u0442 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 <code>values<\/code> \u0432\u0435\u0440\u043d\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<h4>ItemList.limit_to<\/h4>\n<p>  \u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>10<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443 \u043d\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u043b\u0438.<\/p>\n<h3>Chart<\/h3>\n<p>  \u0414\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"http:\/\/gionkunz.github.io\/chartist-js\/\">Chartist<\/a> \u2014 \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u2026 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u041e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u0430\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043c\u043e\u0433 \u043f\u0440\u043e\u0439\u0442\u0438 \u043c\u0438\u043c\u043e.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 \u0447\u0430\u0440\u0442\u043e\u0432: <code>LINE<\/code>, <code>BAR<\/code>, <code>PIE<\/code>; \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a \u043d\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b: <code>LineChart<\/code>, <code>BarChart<\/code>, <code>PieChart<\/code>. \u041f\u043b\u044e\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <code>Chart<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0440\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430: <code>legend<\/code>, <code>lables<\/code>, <code>series<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u0438 \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0412\u0441\u0435 \u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c json-\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a \u043a\u043e\u0438\u043c \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b.<\/p>\n<pre><code class=\"python\">class MyChart(widgets.Chart):     def legend(self):         return []      def labels(self):         return []      def series(self):         return []<\/code><\/pre>\n<p>  <\/p>\n<h4>Chart.legend<\/h4>\n<p>  \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 <a href=\"http:\/\/gionkunz.github.io\/chartist-js\/\">Chartist<\/a> \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043b\u0435\u0433\u0435\u043d\u0434\u0443, \u043d\u043e \u0431\u0435\u0437 \u043d\u0435\u0435 \u043d\u0438\u043a\u0430\u043a, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0447\u0430\u0440\u0442\u0438\u0441\u0442 \u0435\u0449\u0435 \u0438 \u043d\u0435 \u0440\u0438\u0441\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 (\u0434\u0430, \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442). \u041b\u0435\u0433\u0435\u043d\u0434\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.<\/p>\n<h4>Chart.labels<\/h4>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u0438 <code>x<\/code>. \u0414\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440.<\/p>\n<h4>Chart.series<\/h4>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u0438 <code>y<\/code>. \u0414\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f &quot;\u0433\u043e\u0442\u0447\u0430&quot;, \u0434\u043b\u044f \u0442\u0438\u043f\u0430 <code>BAR<\/code> \u0441 \u043e\u0434\u043d\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f &quot;\u043f\u043b\u043e\u0441\u043a\u0438\u0439&quot; \u0441\u043f\u0438\u0441\u043e\u043a, \u0442.\u0435. \u043d\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f \u0434\u043b\u044f \u0447\u0430\u0440\u0442\u0438\u0441\u0442\u0430. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>SingleBarChart<\/code> \u2014 \u0432 \u043d\u0435\u043c \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e.<\/p>\n<h4>Chart.Chartist<\/h4>\n<p>  <code>Chart<\/code> \u2014 \u044d\u0442\u043e \u0432\u0438\u0434\u0436\u0435\u0442 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>Chartist<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430 \u043c\u0430\u043d\u0435\u0440 <code>Meta<\/code> \u0438\u043b\u0438 <code>Media<\/code> \u0432 \u0434\u0436\u0430\u043d\u0433\u0435.<\/p>\n<pre><code class=\"python\">class MyChart(Chart):     class Chartist:         klass = widgets.LINE         point_lables = True         options = {             'reverseData': True,             'axisY': {                 'onlyInteger': True,             },             'fullWidth': True,         }<\/code><\/pre>\n<p>  \u0421 \u0442\u043e\u0439 \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>Chartist<\/code> \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u0442.\u0435. \u044d\u0442\u043e \u043a\u0430\u043a \u0431\u044b \u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 python inheritance: \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 <code>class Chartist:<\/code>, \u0430 \u043d\u0435 <code>class Chartist(Parent.Chartist):<\/code> \u2014 \u043f\u043e\u043b\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0412 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u043e\u043b\u044f, \u043a\u0440\u043e\u043c\u0435 <code>options<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c, \u0442.\u0435. \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 <code>Parent.Chartist.options.copy().update({'foo': 'bar'})<\/code>. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0443 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430: \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<p>  \u0412\u0430\u0436\u043d\u043e! \u0414\u043b\u044f <code>LineChart<\/code> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e <code>'reverseData': True<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>labels<\/code> \u0438 <code>series<\/code> \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0447\u0430\u0440\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0447\u0430\u0440\u0442\u0435 \u044d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u044d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<h5>Chart.Chartist.klass<\/h5>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f \u0447\u0430\u0440\u0442\u0430: <code>widgets.LINE<\/code>, <code>widgets.BAR<\/code>, <code>widgets.PIE<\/code>.<\/p>\n<h5>Chart.Chartist.point_lables<\/h5>\n<p>  \u041f\u043e\u0434\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u0443\u0433\u0438\u043d \u043a <code>Chartist<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435. \u042d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0447\u0430\u0440\u0442\u0438\u0441\u0442 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0435. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 <code>widgets.LINE<\/code>. \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>legend<\/code>.<\/p>\n<h5>Chart.Chartist.options<\/h5>\n<p>  \u0421\u043b\u043e\u0432\u0430\u0440\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0436\u0441\u043e\u043d \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0447\u0430\u0440\u0442\u0438\u0441\u0442\u0430. \u0412\u0441\u0435 \u043e\u043f\u0446\u0438\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b <a href=\"http:\/\/gionkunz.github.io\/chartist-js\/\">\u043d\u0430 \u0441\u0430\u0439\u0442\u0435<\/a>.<\/p>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/h4>\n<p>  \u0412 \u043c\u043e\u0434\u0443\u043b\u0435 <code>widgets<\/code> \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u044b \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432: <code>SingleLineChart<\/code>, <code>SingleBarChart<\/code>, <code>SinglePieChart<\/code> \u2014 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u044e\u0437\u043a\u0435\u0439\u0441\u043e\u0432.<\/p>\n<pre><code class=\"python\">class BlogsChart(widgets.SingleBarChart):     model = Blog     values_list = ('name', 'score')<\/code><\/pre>\n<p>  \u041d\u0443, \u0441\u043e\u0431\u0441\u043d\u043e, \u0438 \u0432\u0441\u0435. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>name<\/code> \u043f\u043e\u0439\u0434\u0443\u0442 \u0432 \u043e\u0441\u044c <code>x<\/code>, \u0430 <code>score<\/code> \u0432 \u043e\u0441\u044c <code>y<\/code>.<\/p>\n<h2>Dashboard<\/h2>\n<p>  \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043e 10 &quot;\u043f\u0430\u043d\u0435\u043b\u0435\u0439&quot;, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: <code>\/admin\/dashboards\/[pk]\/<\/code> \u2014\u00a0\u0433\u0434\u0435 <code>pk<\/code> \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <code>settings.CONTROLCENTER_DASHBOARDS<\/code>.<\/p>\n<h3>Dashboard.widgets<\/h3>\n<p>  \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.<\/p>\n<h3>Dashboard.title<\/h3>\n<p>  \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d, \u0431\u0443\u0434\u0435\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h3>Dashboard.Media<\/h3>\n<p>  \u041a\u043b\u0430\u0441\u0441 <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/topics\/forms\/media\/\">Media<\/a> \u0438\u0437 \u0434\u0436\u0430\u043d\u0433\u0438.<\/p>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/h2>\n<p>  <\/p>\n<pre><code class=\"python\">#  \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0448\u0431\u043e\u0430\u0440\u0434\u043e\u0432 CONTROLCENTER_DASHBOARDS = []  # \u0414\u0438\u0435\u0437 \u0434\u043b\u044f \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a \u0432 `ItemList` CONTROLCENTER_SHARP = '#'  # \u0426\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0434\u043b\u044f `Chartist`, # \u043d\u043e \u0435\u0449\u0435 \u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u0442\u0435\u043c\u0443 \u0432 \u0446\u0432\u0435\u0442\u0430\u0445 `Material Design`, # \u043f\u043e\u0434\u0441\u0442\u0432\u0430\u043b\u044f\u0435\u043c `material`. CONTROLCENTER_CHARTIST_COLORS = 'default'<\/code><\/pre>\n<p>  <\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b!<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435.<br \/>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <code>pizzeria<\/code>, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <code>pizza<\/code>.<\/p>\n<h3>pizzeria.pizza.models<\/h3>\n<p>  <\/p>\n<pre><code class=\"python\">from __future__ import unicode_literals from django.db import models  class Pizza(models.Model):     name = models.CharField(max_length=100, unique=True)      def __str__(self):         return self.name  class Restaraunt(models.Model):     name = models.CharField(max_length=100, unique=True)     menu = models.ManyToManyField(Pizza, related_name='restaraunts')      def __str__(self):         return self.name  class Order(models.Model):     created = models.DateTimeField(auto_now_add=True)     restaraunt = models.ForeignKey(Restaraunt, related_name='orders')     pizza = models.ForeignKey(Pizza, related_name='orders')<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/h3>\n<p>  <\/p>\n<pre><code class=\"bash\">pip install django-controlcenter<\/code><\/pre>\n<p>  \u0412\u043d\u0435\u0441\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 <code>pizzeria.settings<\/code><\/p>\n<pre><code class=\"python\">INSTALLED_APPS = (     ...     'controlcenter',     'pizza', )  # \u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434 CONTROLCENTER_DASHBOARDS = (     'pizzeria.dashboards.MyDashboard' )<\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u0440\u043b\u044b \u0432 <code>pizzeria.urls<\/code><\/p>\n<pre><code class=\"python\">from django.conf.urls import url from django.contrib import admin from controlcenter.views import controlcenter  urlpatterns = [     url(r'^admin\/', admin.site.urls),     url(r'^admin\/dashboard\/', controlcenter.urls), ]<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0412\u0438\u0434\u0436\u0435\u0442\u044b<\/h3>\n<p>  \u0412 \u0444\u0430\u0439\u043b\u0435 <code>pizzeria.dashboards<\/code> \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0438\u0434\u0436\u0435\u0442\u044b:<\/p>\n<pre><code class=\"python\">import datetime from collections import defaultdict  from controlcenter import app_settings, Dashboard, widgets from controlcenter.widgets.core import WidgetMeta from django.db.models import Count from django.utils import timezone from django.utils.timesince import timesince  from .pizza.models import Order, Pizza, Restaraunt  class MenuWidget(widgets.ItemList):     # \u042d\u0442\u043e\u0442 \u0432\u0438\u0434\u0436\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0438\u0446\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438     # \u043f\u0440\u043e\u0434\u0430\u043d\u044b \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0435. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c     # \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0439, \u0430 \u043f\u043e\u0437\u0436\u0435 \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u043e\u0432.     model = Pizza     list_display = ['name', 'ocount']     list_display_links = ['name']      # \u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0432 ItemList \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430,      # \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435 \u0432\u044b\u0432\u0435\u043b\u0438 \u0432\u0441\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0440\u0430\u043c\u043e\u0447\u043a\u0435.     limit_to = None      # \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0436\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 300, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043a\u0440\u043e\u043b\u043b     height = 300      def get_queryset(self):         # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0438\u0446\u0446 \u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u044b \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f         restaraunt = super(MenuWidget, self).get_queryset().get()         today = timezone.now().date()         return (restaraunt.menu                           .filter(orders__created__gte=today)                           .order_by('-ocount')                           .annotate(ocount=Count('orders')))  class LatestOrdersWidget(widgets.ItemList):     # \u0412\u0438\u0434\u0436\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 20 \u0437\u0430\u043a\u0430\u0437\u043e\u0432     # \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0435     model = Order     queryset = (model.objects                      .select_related('pizza')                      .filter(created__gte=timezone.now().date())                      .order_by('pk'))     # \u0414\u043e\u0431\u0430\u0432\u0438\u043c `#` \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a     list_display = [app_settings.SHARP, 'pk', 'pizza', 'ago']     list_display_links = ['pk']      # \u0412\u043a\u043b\u044e\u0447\u0438\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435     sortable = True      # \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 20     limit_to = 20      # \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435     height = 300      # \u0414\u0430\u0442\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u043d\u044c\u043a\u043e     def ago(self, obj):         return timesince(obj.created)  RESTARAUNTS = [     'Mama',     'Ciao',     'Sicilia', ]  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u0430-\u043a\u043b\u0430\u0441\u0441, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442\u044b. # \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0438 \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b. # \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b: # \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b menu_widgets = [WidgetMeta('{}MenuWidget'.format(name),                            (MenuWidget,),                            {'queryset': Restaraunt.objects.filter(name=name),                             # \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a                             'title': name + ' menu',                             # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 `changelist` \u043c\u043e\u0434\u0435\u043b\u0438 \u0441 GET \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c                             'changelist_url': (                                  Pizza, {'restaraunts__name__exact': name})})                 for name in RESTARAUNTS]  latest_orders_widget = [WidgetMeta(                            '{}LatestOrders'.format(name),                            (LatestOrdersWidget,),                            {'queryset': (LatestOrdersWidget                                             .queryset                                             .filter(restaraunt__name=name)),                             'title': name + ' orders',                             'changelist_url': (                                  Order, {'restaraunt__name__exact': name})})                         for name in RESTARAUNTS]  class RestarauntSingleBarChart(widgets.SingleBarChart):     # \u0421\u0442\u0440\u043e\u0438\u0442 \u0431\u0430\u0440-\u0447\u0430\u0440\u0442 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u0437\u0430\u043a\u0430\u0437\u043e\u0432     title = 'Most popular restaraunt'     model = Restaraunt      class Chartist:         options = {             # \u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, Chartist \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c             # float \u043a\u0430\u043a \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u044d\u0442\u043e \u043d\u0438 \u043a \u0447\u0435\u043c\u0443             'onlyInteger': True,             # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0447\u0430\u0440\u0442\u0430 -- \u043a\u043e\u0441\u043c\u0435\u0442\u0438\u043a\u0430             'chartPadding': {                 'top': 24,                 'right': 0,                 'bottom': 0,                 'left': 0,             }         }      def legend(self):         # \u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u043b\u0435\u0433\u0435\u043d\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0438 `y`,         # \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, Chartist \u043d\u0435 \u0440\u0438\u0441\u0443\u0435\u0442 \u0441\u0430\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435         return self.series      def values(self):         queryset = self.get_queryset()         return (queryset.values_list('name')                         .annotate(baked=Count('orders'))                         .order_by('-baked')[:self.limit_to])  class PizzaSingleBarChart(RestarauntSingleBarChart):     # \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0432\u0438\u0434\u0436\u0435\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443,     # \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u0435 \u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u0440\u043e\u043c\u0435 \u0442\u0438\u043f\u0430 \u0447\u0430\u0440\u0442\u0430     model = Pizza     limit_to = 3     title = 'Most popular pizza'      class Chartist:         # \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0438\u043f \u0447\u0430\u0440\u0442\u0430         klass = widgets.PIE  class OrderLineChart(widgets.LineChart):     # \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u043f\u0440\u043e\u0434\u0430\u0436 \u0432 \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0430\u0445     # \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 7 \u0434\u043d\u0435\u0439     title = 'Orders this week'     model = Order     limit_to = 7     # \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0447\u0438\u043a \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435     width = widgets.LARGER      class Chartist:         # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0430\u0440\u0442\u0438\u0441\u0442\u0430 -- \u043a\u043e\u0441\u043c\u0435\u0442\u0438\u043a\u0430         options = {             'axisX': {                 'labelOffset': {                     'x': -24,                     'y': 0                 },             },             'chartPadding': {                 'top': 24,                 'right': 24,             }         }      def legend(self):         # \u0412 \u043b\u0435\u0433\u0435\u043d\u0434\u0443 \u043f\u043e\u0439\u0434\u0443\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u043e\u0432         return RESTARAUNTS      def labels(self):         # \u041f\u043e \u043e\u0441\u0438 `x` \u0434\u043d\u0438         today = timezone.now().date()         labels = [(today - datetime.timedelta(days=x)).strftime('%d.%m')                   for x in range(self.limit_to)]         return labels      def series(self):         # \u041c\u044b \u0431\u0435\u0440\u0435\u043c \u0434\u0430\u0442\u044b \u0438\u0437 `labels`, \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0430\u0437\u044b, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442          # \u0431\u044b\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u043d\u044b\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0435\u043d\u044c \u0437\u0430\u043a\u0430\u0437\u043e\u0432         # \u043d\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0438 \u044d\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u043a         series = []         for restaraunt in self.legend:             # \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439             # \u0437\u0430 \u043d\u0443\u0436\u043d\u0443\u044e \u0434\u0430\u0442\u0443, \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c 0             item = self.values.get(restaraunt, {})             series.append([item.get(label, 0) for label in self.labels])         return series      def values(self):         # \u041b\u0438\u043c\u0438\u0442 \u043f\u043e\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u043e\u0432         limit_to = self.limit_to * len(self.legend)         queryset = self.get_queryset()         # \u0412\u043e\u0442 \u0442\u0430\u043a \u0432 \u0434\u0436\u0430\u043d\u0433\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c `GROUP BY` \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u043e\u043b\u044f\u043c:          # \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0430 \u0438 \u0434\u0430\u0442\u044b.         # Order.created \u044d\u0442\u043e datetime, \u0430 \u0433\u0440\u0443\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0443\u0436\u043d\u044f \u043f\u043e \u0434\u043d\u044f\u043c,         # \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e `DATE` (sqlite3) \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438.         # \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, ORM \u0434\u0436\u0430\u043d\u0433\u0438 \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0447\u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c          # \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u043e\u043b\u044e         queryset = (queryset.extra({'baked':                                     'DATE(created)'})                             .select_related('restaraunt')                             .values_list('restaraunt__name', 'baked')                             .order_by('-baked')                             .annotate(ocount=Count('pk'))[:limit_to])          # \u041a\u043b\u044e\u0447 -- \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 -- \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u0430\u0442\u0430:\u0447\u0438\u0441\u043b\u043e_\u0437\u0430\u043a\u0430\u0437\u043e\u0432         values = defaultdict(dict)         for restaraunt, date, count in queryset:             # DATE \u0432 Sqlite3 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043d\u0433\u0443 YYYY-MM-DD             # \u0410 \u0432 \u0447\u0430\u0440\u0442\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0438\u0434\u0435\u0442\u044c DD-MM             day_month = '{2}.{1}'.format(*date.split('-'))             values[restaraunt][day_month] = count         return values<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0414\u0435\u0448\u0431\u043e\u0430\u0440\u0434\u044b<\/h3>\n<p>  <a href=\"https:\/\/github.com\/byashimov\/django-controlcenter\">django-controlcenter<\/a> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043e 10 \u0434\u0435\u0448\u0431\u043e\u0430\u0440\u0434\u043e\u0432. \u041d\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0434\u0438\u043d \u0432 <code>pizzeria.dashboards<\/code><\/p>\n<pre><code class=\"python\">class SimpleDashboard(Dashboard):     widgets = (         menu_widgets,         latest_orders_widget,         RestarauntSingleBarChart,         PizzaSingleBarChart,         OrderLineChart,     )<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0435, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c <code>\/admin\/dashboard\/0\/<\/code>.<\/p>\n<h2>\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c<\/h2>\n<p>  \u0422\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 python 2.7.9, 3.4.3, 3.5.0 \u0438 django 1.8, 1.9.<\/p>\n<pre><code>Name                                               Stmts   Miss  Cover ---------------------------------------------------------------------- controlcenter\/__init__.py                              1      0   100% controlcenter\/app_settings.py                         27      0   100% controlcenter\/base.py                                 10      0   100% controlcenter\/dashboards.py                           27      0   100% controlcenter\/templatetags\/__init__.py                 0      0   100% controlcenter\/templatetags\/controlcenter_tags.py     109      0   100% controlcenter\/utils.py                                16      0   100% controlcenter\/views.py                                39      0   100% controlcenter\/widgets\/__init__.py                      2      0   100% controlcenter\/widgets\/charts.py                       67      0   100% controlcenter\/widgets\/core.py                         93      0   100% ---------------------------------------------------------------------- TOTAL                                                391      0   100% _______________________________ summary ______________________________   py27-django18: commands succeeded   py27-django19: commands succeeded   py34-django18: commands succeeded   py34-django19: commands succeeded   py35-django18: commands succeeded   py35-django19: commands succeeded<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0436\u0438\u0442 \u0441 <a href=\"https:\/\/github.com\/sehmaschine\/django-grappelli\">django-grappelli<\/a>.<\/p>\n<h2>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u042d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0432\u043e\u0439, \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u043a\u043e\u0440\u044f\u0432\u044b\u0439 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044e \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0443\u0441\u044c \u0441\u043e sphinx.<\/p>\n<p>  P.S. \u042f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f OSP \u0438, \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c\u0441\u044f, \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0441 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0446\u0438\u0435\u0439, \u0447\u0435\u043c \u043d\u0430 \u0441\u0430\u043c \u043a\u043e\u0434, \u0438 \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u044f \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d \u0437\u0430 \u043b\u044e\u0431\u043e\u0439 \u0444\u0438\u0434\u0431\u0435\u043a.<\/p>\n<p>  P.P.S. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0430\u043c \u0445\u0430\u0431\u0440\u0430 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u0438 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0442 \u0442\u0435\u043a\u0441\u0442\u0430, \u0430 \u0438\u043d\u043b\u0430\u0439\u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f. \u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044e \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.                 <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/278743\/\"> https:\/\/habrahabr.ru\/post\/278743\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/111\/ba0\/3a0\/111ba03a0ef340589937512b6292bd1c.png\" alt=\"django-controlcenter\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0435\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u2014 <a href=\"https:\/\/github.com\/byashimov\/django-controlcenter\">django-controlcenter<\/a>. \u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0448\u0431\u043e\u0443\u0440\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e django-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-275629","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/275629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=275629"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/275629\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=275629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=275629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=275629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}