从Django模型获取chart.js的动态数据

时间:2020-08-20 19:16:39

标签: python django chart.js analytics

我正在尝试为登录我的网站的用户创建一个分析仪表板页面。因此,如果用户'DummyCo'登录并转到mywebsite.com/DummyCo/dashbord,他们将看到与模型记录有关的分析,这些记录在其中被列为用户(或在我在模型上称为client的用户)。数据正常工作(如下所示),但这仅允许我显示计数。

我想做的就是开始在我运行并运行的chart.js图表​​中使用此数据,但是它不允许我像其他视图一样抓取该登录用户(图表视图)如下所示)。

models.py

class Session(models.Model):
    uid = models.CharField(max_length=50, blank=True)
    cid = models.CharField(max_length=50, blank=True)
    client = models.CharField(max_length=50, blank=True)

views.py

class DashboardListView(LoginRequiredMixin, ListView):
    template_name = 'blog/dashboard.html'
    context_object_name = 'sessions'
    ordering = ['-session_date']

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Session.objects.filter(client=user).order_by('-session_date')

    def get_context_data(self, **kwargs):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        context = super().get_context_data(**kwargs)
        session_list = list(context['sessions']) 
        context['total_actions'] = Session.objects.filter(client=user).count()  # count function
        context['total_users'] = Session.objects.filter(client=user).values('uid').distinct().count()
        context['total_modules'] = Session.objects.filter(client=user).values('cid').distinct().count()
        context['sessions'] = session_list
        return context

@ login_required()
def dashboard(request):
    return render(request, 'blog/dashboard.html', {'title': 'Dashboard'})

urls.py

 path('<str:username>/dashboard/', views.dashboard and DashboardListView.as_view(), name='blog-dashboard')

产生的html标签

{{ total_users }}, {{ total_actions }}, {{ total_modules }}

现在这是我设置chart.js的方式:

views.py

class ChartData(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        session = Session.objects.filter(client='DummyCo').count()
        labels = ['Sessions', 'Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange']
        default_items = [session, 12, 15, 15, 22, 23, 20]
        data = {
            "labels": labels,
            "default": default_items,
        }
        return Response(data)

urls.py

    url(r'^api/chart/data/$', ChartData.as_view()),

带有ajax和所有chart.js内容的html代码

{% block jquery %}
var endpoint = '/api/chart/data/'
var defaultData = []
var labels = [];
$.ajax({
    method: "GET",
    url: endpoint,
    success: function(data){
        labels = data.labels
        defaultData = data.default
        setChart()
    },
    error: function(error_data){
        console.log("error")
        console.log(error_data)
        }
})

function setChart(){
    var ctx = document.getElementById('myChart').getContext('2d');
        var myChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: labels,
                datasets: [{
                    label: '# of Votes',
                    data: defaultData,
                    backgroundColor:... (cutting off here for sanity)

但是如何用URL的username替换硬编码的'DummyCo'?这样,当一个用户注销而新用户登录时,他们只能看到自己的数据。

我认为有一种简单的方法可以将(client='DummyCo')替换为(client=self.get('username')的内容,但我还无法破解。或者,也许我的URL不知道其实际显示在我的网站上的页面是什么,我需要对该URL进行第二次查看吗?

1 个答案:

答案 0 :(得分:0)

您需要在URL中提供客户端:

url(r'^api/chart/data/<str:client>$', ChartData.as_view()),

然后将其作为参数放在get

def get(self, request, client):

我不确定您为什么没有format = None。它与您的urls.py

中的任何内容都不对应

此外,我建议不要将Django REST框架的APIView用于非API视图(例如,您正在渲染页面,而不提供REST API端点)。 为此,只需使用普通的Django class based views.

相关问题