【问题标题】:Getting dynamic data for chart.js from Django model从 Django 模型获取 chart.js 的动态数据
【发布时间】:2020-08-20 19:16:39
【问题描述】:

我正在尝试为登录我网站的用户创建一个分析仪表板页面。因此,如果用户“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=self.get('username') 的东西替换(client='DummyCo'),但我还没有破解它。或者我的 URL 不知道它实际显示在我网站上的哪个页面,我需要为 URL 引入第二个视图?

【问题讨论】:

    标签: python django chart.js analytics


    【解决方案1】:

    您需要在网址中提供客户端:

    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.

    【讨论】:

    • 所以这是一个奇怪的情况,我使用的 url 路径实际上并不是我访问查看图表的路径。图表本身显示在 URL path('&lt;str:username&gt;/dashboard/', views.dashboard and DashboardListView.as_view(), name='blog-dashboard'), 上,在我的用例中,“用户名”将与“客户端”完全相同。我应该废弃url(r'^api/chart/data/$', ChartData.as_view()), 并尝试使其直接在仪表板视图上工作吗?我只是不明白 ajax/java 正在发生的事情,例如:$ 的使用。我学到的视频尝试了我不需要的 API 连接。
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 2020-09-19
    • 2022-11-27
    • 2023-04-09
    • 2019-06-29
    • 2018-04-17
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多