如何解决从Django模型获取chart.js的动态数据
我正在尝试为登录我的网站的用户创建一个分析仪表板页面。因此,如果用户'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,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进行第二次查看吗?
解决方法
您需要在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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。