Django 如何创建一个折线图,指示用户在哪个月写了更多或更少的博客?

Django 如何创建一个折线图,指示用户在哪个月写了更多或更少的博客?,django,chart.js,Django,Chart.js,这就是我想要的输出- 根据上面的图表,用户在3月到4月之间写了很多帖子,然后在7月这个数字就减少了 我曾使用过表格和饼图,但无法使这一个工作。以下是可用于此目的的Django模型示例: class Blog(models.Model): title = models.CharField(max_length=160) ... created_at = models.DateTimeField(auto_now_add=True) 我知道这里要使用的数据可以从creat

这就是我想要的输出-

根据上面的图表,用户在3月到4月之间写了很多帖子,然后在7月这个数字就减少了

我曾使用过表格和饼图,但无法使这一个工作。以下是可用于此目的的Django模型示例:

class Blog(models.Model):
    title = models.CharField(max_length=160)
    ...
    created_at = models.DateTimeField(auto_now_add=True)
我知道这里要使用的数据可以从
created_at
字段中提取,但我不知道如何执行
JavaScript
部分。如果我在模板中传递
{“blogs”:Blog.objects.all()}
上下文,我如何像线栏一样在上面打印。请帮忙


谢谢。

因为您正在使用Django,所以我将使用

在your views.py中:

import plotly.offline as pyo
import plotly.graph_objs as go
import datetime as dt
import calendar



time_values = Blog.objects.all().order_by("created_at")

time_values = [ element.created_at for element in time_values ]

time_values = [ element.month for element in time_values ]



published_amounts = [ 1 for element in time_values ]

new_time_values = [ time_values[0] ]
published_amounts = [ 0 ]

j=0

# the cycle prevents mixing months from different years
for i in range( 1, len(time_values) ):

    if time_values[i]==time_values[i-1]:
        published_amounts[j] = published_amounts[j] + 1

        
    else:   
        new_time_values.append(time_values[i])
        published_amounts.append(1)        
        j=j+1


new_time_values = [calendar.month_name[element] for element in new_time_values ]      
        

post_line = go.Scatter(
                    x=new_time_values, 
                    y=published_amounts,
                    mode='lines+markers',
                    name="Published posts",              
                    )

data = [ post_line, ]  

layout = go.Layout(showlegend=True, )

fig = go.Figure(data=data, layout=layout)

plt_div = pyo.plot(fig, output_type='div')

context_dict={
        "plt_div":plt_div
                }

return render(request, 'your_page.html', context_dict)
然后,在模板中,您只需将

{{plt_div}}

您希望图形显示在何处。

那么您希望每月按
cleaning\u分组的博客数量
?是的,表示用户在哪个月发布了多少博客,但使用折线图屏幕截图看起来像chartjs,请参阅感谢您花时间回答。我得到了这个错误
'int'对象不可调用
从这一行
时间值=[element.month()对于时间值中的元素]
我尝试了其他方法,但都不起作用。monthI之前做了这件事,但我一直得到错误<代码>列表索引超出范围在'if time\u values[i]==time\u values[i]:`line中。我想现在它可以工作了。请再次复制并粘贴我的答案。谢谢你,兄弟,我标记了
chart.js
,因为我期待它来自chart.js。这是一个很好的解决方案,但缺少一些解释,因为我以前从未使用过
potly
,不过还是要谢谢你。